[2581] 백준 문제풀이 - 소수

https://www.acmicpc.net/problem/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을 출력한다.

풀이

이 블로그에 올려둔 [수학개념] 소수의 판별, 에라토스테네스의 체라는 글을 보면 1부터 원하는 수까지의 소수를 구하는 코드가 들어가있다. 이 코드를 활용해서 num_min과 배열을 더해주는 코드만 더 해주면 정답 처리가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import math

num_min = int(input())
n = int(input())
arr = [True for i in range(n + 1)]  # n만큼의 배열을 만들고 그 수를 전부 True로 채워줌

# 쉬운 방법에서 n의 제곱근(가운데 약수)만큼 확인해도 답이 나오는데 지장이 없어서 math.sqrt(n) 활용해 코드 개선
for i in range(2, int(math.sqrt(n)) + 1):
    if arr[i] == True:  # i가 소수일 때(남은 수)
        j = 2  # 배수
        while i * j <= n:
            arr[i * j] = False  # 수를 False로 바꿔줌
            j += 1

temp = []
for i in range(2, n + 1):
    if arr[i] and i >= num_min:
        temp.append(i)

if temp == []:
    print(-1)
else:
    print(sum(temp))
    print(temp[0])

댓글남기기