백준 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
마지막 방법도 구현하기했는데, 이것도 함수라 백준에 제출해보지는 않았다..
Comments powered by Disqus.