
이것도 매우매우 쉬웠던 문제! 두 번 틀렸는데 이번에도 세세한 부분을 놓쳐서 틀렸을 뿐 전체적인 흐름은 쉬웠다.
우선 소수를 구한다는 점에서 에라토스테네스의 체를 사용했다. 그리고 입력받은 M과 N사이의 소수들만 출력해주면 됐기 때문에 매우 쉬웠다 ..
import math
MAX = 1000000
prime = [True for i in range(MAX+1)]
prime[1] = False
for i in range (2, int(math.sqrt(MAX))+1):
if(prime[i] == True):
j = 2
while i*j <= MAX:
prime[i*j] = False
j += 1
M, N = map(int, input().split())
for i in range(M, N+1):
if(prime[i]): print(i)
내가 놓쳤던 부분은 range 함수의 범위와 1이었다.
일단 1은 소수에 해당하지 않는다. 그렇기 때문에 소수를 구할 때 1또한 False로 정의해둬야한다. 처음 에라토스테네스의 체 소스코드를 작성할 때 해당 부분을 적어두지 않았더니 가끔 문제를 틀리는 경우가 종종있다. 소스코드 자체를 업데이트 해둬야할 것 같다.
내가 틀린 이유를 적기 전에 range 함수에 대해 간단히 정리해보았다.
range 함수를 사용하는 방법에는 크게 3가지가 있다.
range(10)은 숫자 0,1,2,3,4,5,6,7,8,9를 생성한다. start 숫자에 대한 표시가 없으면 0부터 시작하고, stop-1까지 생성한다.
range(1,10)은 숫자 1,2,3,4,5,6,7,8,9를 생성한다. 인자 두 개를 전달하는 경우에는 앞의 숫자는 start, 뒤의 숫자는 stop 인자로 start부터 stop-1까지 숫자를 생성한다.
range(0,10,2)는 숫자 0,2,4,6,8을 생성한다. 인자 세 개가 전달됐을 때는 앞의 두 개는 start와 stop, 그리고 마지막 인자는 step을 의미한다. start로부터 step만큼 숫자를 증가시키라는 뜻이다.
만약 range(10,0,-2)라고 작성했다면 숫자 10,8,6,4,2를 생성했을 것이다.
문제의 마지막에 for문을 사용하는데, 이 때 range()함수를 함께 사용했다. 이때 내가 처음 작성했던 코드는 아래와 같다.
for i in range(M, N):
if(prime[i]): print(i)
단순이 M과 N사이에 있는 숫자를 출력해야지, 했던 것인데 range()함수가 N-1까지 출력한다는 사실을 잊고 있었다. 그래서 문제를 제출할 때는 N+1로 수정했고 처음 의도했던데로 M부터 N까지 출력할 수 있었다.