문제
정수 n(0 ≤ n ≤ 4*109)가 주어졌을 때, n보다 크거나 같은 소수 중 가장 작은 소수 찾는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.
출력
각각의 테스트 케이스에 대해서 n보다 크거나 같은 소수 중 가장 작은 소수를 한 줄에 하나씩 출력한다.
예제 입력 1
3
6
20
100
예제 출력 1
7
23
101
소수를 구하는 방법이 무엇이 있는 지에 대해 찾아보았다. 그 중 고대 그리스의 수학자 에라토스테네스가 만들어 낸 방법인 '에라토스테네스의 체'라는 방법을 찾아 해법에 적용시켜보았다.
'에라토스테네스의 체'는 특정 범위 안에 있는 소수를 찾는 방법으로 아주 유용한 방법인데, 이를 예시로 들어 1 ~ 144 까지 숫자 중 소수를 찾는다고 하면, 아래와 같은 순서로 이루어진다.
일단 1부터 144까지 숫자를 쭉 쓴다.
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
87
|
88
|
89
|
90
|
91
|
92
|
93
|
94
|
95
|
96
|
97
|
98
|
99
|
100
|
101
|
102
|
103
|
104
|
105
|
106
|
107
|
108
|
109
|
110
|
111
|
112
|
113
|
114
|
115
|
116
|
117
|
118
|
119
|
120
|
121
|
122
|
123
|
124
|
125
|
126
|
127
|
128
|
129
|
130
|
131
|
132
|
133
|
134
|
135
|
136
|
137
|
138
|
139
|
140
|
141
|
142
|
143
|
144
|
일단 소수도, 합성수도 아닌 유일한 자연수 1을 제거하자.
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
87
|
88
|
89
|
90
|
91
|
92
|
93
|
94
|
95
|
96
|
97
|
98
|
99
|
100
|
101
|
102
|
103
|
104
|
105
|
106
|
107
|
108
|
109
|
110
|
111
|
112
|
113
|
114
|
115
|
116
|
117
|
118
|
119
|
120
|
121
|
122
|
123
|
124
|
125
|
126
|
127
|
128
|
129
|
130
|
131
|
132
|
133
|
134
|
135
|
136
|
137
|
138
|
139
|
140
|
141
|
142
|
143
|
144
|
2를 제외한 2의 배수를 제거한다.
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
32
|
33
|
34
|
35
|
36
|
37
|
38
|
39
|
40
|
41
|
42
|
43
|
44
|
45
|
46
|
47
|
48
|
49
|
50
|
51
|
52
|
53
|
54
|
55
|
56
|
57
|
58
|
59
|
60
|
61
|
62
|
63
|
64
|
65
|
66
|
67
|
68
|
69
|
70
|
71
|
72
|
73
|
74
|
75
|
76
|
77
|
78
|
79
|
80
|
81
|
82
|
83
|
84
|
85
|
86
|
87
|
88
|
89
|
90
|
91
|
92
|
93
|
94
|
95
|
96
|
97
|
98
|
99
|
100
|
101
|
102
|
103
|
104
|
105
|
106
|
107
|
108
|
109
|
110
|
111
|
112
|
113
|
114
|
115
|
116
|
117
|
118
|
119
|
120
|
121
|
122
|
123
|
124
|
125
|
126
|
127
|
128
|
129
|
130
|
131
|
132
|
133
|
134
|
135
|
136
|
137
|
138
|
139
|
140
|
141
|
142
|
143
|
144
|
3을 제외한 3의 배수를 제거한다.
|
2
|
3
|
|
5
|
|
7
|
|
9
|
|
11
|
|
13
|
|
15
|
|
17
|
|
19
|
|
21
|
|
23
|
|
25
|
|
27
|
|
29
|
|
31
|
|
33
|
|
35
|
|
37
|
|
39
|
|
41
|
|
43
|
|
45
|
|
47
|
|
49
|
|
51
|
|
53
|
|
55
|
|
57
|
|
59
|
|
61
|
|
63
|
|
65
|
|
67
|
|
69
|
|
71
|
|
73
|
|
75
|
|
77
|
|
79
|
|
81
|
|
83
|
|
85
|
|
87
|
|
89
|
|
91
|
|
93
|
|
95
|
|
97
|
|
99
|
|
101
|
|
103
|
|
105
|
|
107
|
|
109
|
|
111
|
|
113
|
|
115
|
|
117
|
|
119
|
|
121
|
|
123
|
|
125
|
|
127
|
|
129
|
|
131
|
|
133
|
|
135
|
|
137
|
|
139
|
|
141
|
|
143
|
|
4의 배수는 지울 필요 없다.(2의 배수에서 이미 지워졌다.)
그러면 2, 3 다음으로 남아있는 가장 작은 소수, 즉 5를 제외한 5의 배수를 제거해야 한다.
|
2
|
3
|
|
5
|
|
7
|
|
|
|
11
|
|
13
|
|
|
|
17
|
|
19
|
|
|
|
23
|
|
25
|
|
|
|
29
|
|
31
|
|
|
|
35
|
|
37
|
|
|
|
41
|
|
43
|
|
|
|
47
|
|
49
|
|
|
|
53
|
|
55
|
|
|
|
59
|
|
61
|
|
|
|
65
|
|
67
|
|
|
|
71
|
|
73
|
|
|
|
77
|
|
79
|
|
|
|
83
|
|
85
|
|
|
|
89
|
|
91
|
|
|
|
95
|
|
97
|
|
|
|
101
|
|
103
|
|
|
|
107
|
|
109
|
|
|
|
113
|
|
115
|
|
|
|
119
|
|
121
|
|
|
|
125
|
|
127
|
|
|
|
131
|
|
133
|
|
|
|
137
|
|
139
|
|
|
|
143
|
|
6의 배수는 지울 필요 없으니(2의 배수에서 이미 지워졌다.) 7을 제외한 7의 배수를 제거한다.
|
2
|
3
|
|
5
|
|
7
|
|
|
|
11
|
|
13
|
|
|
|
17
|
|
19
|
|
|
|
23
|
|
|
|
|
|
29
|
|
31
|
|
|
|
|
|
37
|
|
|
|
41
|
|
43
|
|
|
|
47
|
|
49
|
|
|
|
53
|
|
|
|
|
|
59
|
|
61
|
|
|
|
|
|
67
|
|
|
|
71
|
|
73
|
|
|
|
77
|
|
79
|
|
|
|
83
|
|
|
|
|
|
89
|
|
91
|
|
|
|
|
|
97
|
|
|
|
101
|
|
103
|
|
|
|
107
|
|
109
|
|
|
|
113
|
|
|
|
|
|
119
|
|
121
|
|
|
|
|
|
127
|
|
|
|
131
|
|
133
|
|
|
|
137
|
|
139
|
|
|
|
143
|
|
8의 배수는 지울 필요 없다.(2의 배수에서 이미 지워졌다.) 9의 배수도 지울 필요 없다.(3의 배수에서 이미 지워졌다.) 10의 배수도 지울 필요 없다.(2의 배수에서 이미 지워졌다.) 마지막으로 11을 제외한의 11의 배수 중 121과 143을 제거하면 다음과 같이 된다.
|
2
|
3
|
|
5
|
|
7
|
|
|
|
11
|
|
13
|
|
|
|
17
|
|
19
|
|
|
|
23
|
|
|
|
|
|
29
|
|
31
|
|
|
|
|
|
37
|
|
|
|
41
|
|
43
|
|
|
|
47
|
|
|
|
|
|
53
|
|
|
|
|
|
59
|
|
61
|
|
|
|
|
|
67
|
|
|
|
71
|
|
73
|
|
|
|
|
|
79
|
|
|
|
83
|
|
|
|
|
|
89
|
|
|
|
|
|
|
|
97
|
|
|
|
101
|
|
103
|
|
|
|
107
|
|
109
|
|
|
|
113
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127
|
|
|
|
131
|
|
|
|
|
|
137
|
|
139
|
|
|
|
|
이런 식으로 특정 수까지 소수를 찾을 때 가장 작은 소수의 배수부터 제거하는 방식으로 소수를 찾는 방법을 '에라토스테네스의 체'라 한다.
이제 이 방법을 문제에 적용시켜보자, 문제에선 주어진 숫자가 소수면 주어진 숫자를, 아니라면 주어진 숫자보다 크면서 가장 근접한 소수를 구하라 나와있다. 이를 위해서는 먼저, 주어진 숫자가 소수인지 판별하고 아니라면 숫자를 1 씩 증가시켜 판별하는 방식으로 접근했다.
1. 먼저 주어진 숫자가 소수인지 판별하는 함수를 생성한다.
def check(n):
nums = int(n ** 0.5) + 1 # ** 은 거듭제곱을 의미 즉, ** 0.5 = 루트를 의미한다.
for num in range(2, nums):
if n % num == 0:
return False
return True
1 을 제외한 모든 양의 정수에서 2 부터 해당 양의 정수의 거듭제곱근까지 나눈 값의 나머지가 0이 아닐 경우에는 그 수는 소수로 판별한다.
예를 들어, 23 이라는 숫자를 저 함수에 대입하면,
nums = int(23 ** 0.5) + 1 = 루트 16과 루트 25 사이의 수 이기 때문에 4.xxx 이나 int형으로 하여 4 + 1 = 5
23 % 2 = 3 | 23 % 3 = 2 | 23 % 4 = 3
이므로, 23은 소수이다. 5 이상의 숫자를 비교하지 않는 이유는 '에라토스테네스의 체'의 성질에 입각한 이유로, 루트 n 보다 작은 수의 배수만 체크해도 전부 지워진다는 성질 때문이다. (루트 23이 4.xxx)
2. 나머지 조건을 넣은 반복문을 통해 주어진 숫자가 소수인 지 아니라면, 1 을 증가시켜 재 판별시킨다.
최종 코드
import sys
T = int(sys.stdin.readline())
def check(n):
nums = int(n ** 0.5) + 1
for num in range(2, nums):
if n % num == 0:
return False
return True
for _ in range(T):
n = int(sys.stdin.readline())
while True:
if n == 0 or n == 1:
print(2)
break
else:
if check(n):
print(n)
break
else:
n += 1
'BaekJoon' 카테고리의 다른 글
[Python] 17103. 골드바흐 파티션 (0) | 2025.04.15 |
---|---|
[Python] 1929.소수 구하기 (0) | 2025.04.12 |
[Python] 2485. 가로수 (0) | 2025.04.10 |
[Python] 1735. 분수 합 (0) | 2025.04.09 |
[Python] 1934. 최소공배수 (1) | 2025.04.08 |