Bakjoon Q1929 - Python
Q1929
Problem
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
Input
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
Output
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
예제 입력
1
3 16
예제 출력
1
2
3
4
5
3
5
7
11
13
나의 제출
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
a, b = input().split()
a=int(a)
b=int(b)
hint = [False,False] + [True]*(b-1)
for i in range(2,b+1):
if hint[i]:
for j in range(i*i, b+1, i):
hint[j] = False
for k in range(2,a):
hint[k]=False
for l in range(2,b+1):
if hint[l]:
print(l, end='\n')
추가 내용
핵심적인 알고리즘에 대한 설명은 C++ 풀이를 보며 참고하자. 아직 익숙치 않은 python의 문법을 보충하여, 맨 위에서부터 code chunk 별로 설명하겠다.
-
입력 : a, b를 공백을 통한 구분으로 입력을 받았다. 이때 저장된 a와 b는 string 형태로 저장되어 있기 때문에, int()를 통해 형변환을 시켜주었다.
-
hint array 생성 : python은 아주 elastic한 array forming이 되기 때문에, 맨 앞 두 항이 false(0과 1은 소수가 아니기 때문)이고 나머지 항이 True인 배열은 위 코드처럼 쉽게 만들 수 있다. 최대 판정할 숫자가 b이면, 0부터 시작해야하므로 총 b+1 사이즈의 array가 필요하다.
-
0, 1을 제외하고 2부터 b+1까지 가는 loop 생성. 처음 2는 일단 소수이고 true로 되어있기 때문에 if 통과. if 안에서 2*2부터 끝까지 2만큼 상승 (즉 4이상의 2배수)하는 수들을 모두 false로 전환. ….무한반복.
-
2부터 a까지(a이상이므로 a+1이 아니라 a까지만) 모든 value를 false로.
-
print. 매번 repeat할 때마다 끝부분에 개행 삽입.
총평
python으로 하면 훨씬 짧아지긴 하더라. 하지만 그만큼 메모리 사용량도 높고 소요 시간도 크다. 이를 감안하더라도, 엄청난 내부 library의 편의성을 무시할 수는 없을 것 같다.