Home 백준 2581 소수
Post
Cancel

백준 2581 소수

백준 2581 소수

문제

자연수 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을 출력한다.

분석

가장 기본적인 접근 방법은 2부터 자기자신 이전까지 모두 나눠보며 판별하는 방법이다. 이 방법은 당연히 O(n)이다.
소수를 구하기 위해서는 해당 숫자의 절반까지만 계산해도 되는데, 이것도 결국엔 상수항은 무시되기 때문에 O(n)이다.
$\sqrt{N}$까지만 확인하는 방법도 있는데, 약수들의 곱으로 봤을때 $\sqrt{N}$ 값이 중앙값이기 때문에, 이후에는 검사할 필요가 없다고 한다.
이 방법은 O($\sqrt{N}$)이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
m = int(input())
n = int(input())
prime = []

def isPrime(num):
    for _ in range(2, num): # range(2, int(num)/2)
        if num%_==0: return False
    return True

for _ in range(m, n+1):
    if isPrime(_): prime.append(_)

if len(prime)==0: print(-1)
else:
    print(sum(prime))
    print(min(prime))
1
2
620
61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
m = int(input())
n = int(input())
prime = []

for _ in range(m, n+1):
    if _==1:
        pass
    elif _==2:
        prime.append(_)
    else:
        for j in range(2, _):
            if _%j==0: break
            elif j==_-1: prime.append(_)

if len(prime)==0: print(-1)
else:
    print(sum(prime))
    print(min(prime))
1
2
620
61

소수 판별 부분을 함수로 만든건 틀렸다고 그러고, 풀어서 적으면 정답처리가 된다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
m = int(input())
n = int(input())
prime = []

def isPrime(num):
    global _
    for _ in range(2, num+1):
        if _**2>=num: continue
        if num%_==0: return False
    return True
        

for _ in range(m, n+1):
    if isPrime(_): prime.append(_)

if len(prime)==0: print(-1)
else:
    print(sum(prime))
    print(min(prime))
1
2
620
61

마지막 방법도 구현하기했는데, 이것도 함수라 백준에 제출해보지는 않았다..

This post is licensed under CC BY 4.0 by the author.

22년 5월 2주차 주간 회고

GitHub 라이센스 종류

Comments powered by Disqus.