새벽을 밝히는 붉은 달

[Python] 백준 2581번: 소수 개념 다시 짚기! 본문

Online Judge

[Python] 백준 2581번: 소수 개념 다시 짚기!

자윰 2021. 6. 29. 00:35

📎 백준 2581번 풀러 가기

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


소수문제!

1학년 때 처음에 봤을 때 굉장히 난감했던 기억이 난다.

에라토스테네스의 체의 방법으로 소수를 찾는건 알겠는데,

그걸 어떻게 구현하지!?

하고 굉장히 당황했던 기억이 난다.

 

일일히 나누는거였는데 당시에는 일일히 나누는건

너무 비효율적인거 아닌가...? 싶었기 때문!

 

어쨌거나 오랜만에 소수 문제를 풀게 되었다.

 

M부터 N까지의 수 중에서 소수를 찾는건데,

2의 배수는 무조건 소수가 아니므로 리스트에 저장할 때 제외시켜줬다.

이때, 2는 소수이니까 만약 M이 2 이하이고 N이 2 이상이면

2를 리스트에 넣어주었다.

 

그리고 for문을 돌면서 3부터 홀수로만 수를 나눠보면서

수의 절반까지 나눠보았을 때 해당 수가 딱 안 나누어 떨어지면

소수로 판별하는 식으로 짰다.

 

이렇게 오늘도 완료!


아래는 내가 구현한 코드👇

import math

M = int(input())
N = int(input())

num = [x for x in range(M, N + 1) if (x % 2 != 0) and (x > 2)]
if (M <= 2 and N >= 2):
    num.append(2)

prime = list()

for x in range (0, len(num)):
    cp = False

    for i in range (3, math.floor(num[x] / 2), 2):
        if num[x] % i == 0:
            cp = True
            break
    if cp:
        pass
    else:
        prime.append(num[x])

if len(prime) == 0:
    print(-1)
else:
    print(sum(prime))
    print(min(prime))
Comments