백준 1929번 문제풀이

박세은·2023년 8월 15일

Algorithm

목록 보기
9/11

문제 해석

이것도 매우매우 쉬웠던 문제! 두 번 틀렸는데 이번에도 세세한 부분을 놓쳐서 틀렸을 뿐 전체적인 흐름은 쉬웠다.

우선 소수를 구한다는 점에서 에라토스테네스의 체를 사용했다. 그리고 입력받은 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은 소수에 해당하지 않는다. 그렇기 때문에 소수를 구할 때 1또한 False로 정의해둬야한다. 처음 에라토스테네스의 체 소스코드를 작성할 때 해당 부분을 적어두지 않았더니 가끔 문제를 틀리는 경우가 종종있다. 소스코드 자체를 업데이트 해둬야할 것 같다.

range 함수

내가 틀린 이유를 적기 전에 range 함수에 대해 간단히 정리해보았다.

range 함수를 사용하는 방법에는 크게 3가지가 있다.

range(stop)

range(10)은 숫자 0,1,2,3,4,5,6,7,8,9를 생성한다. start 숫자에 대한 표시가 없으면 0부터 시작하고, stop-1까지 생성한다.

range(start, stop)

range(1,10)은 숫자 1,2,3,4,5,6,7,8,9를 생성한다. 인자 두 개를 전달하는 경우에는 앞의 숫자는 start, 뒤의 숫자는 stop 인자로 start부터 stop-1까지 숫자를 생성한다.

range(start, stop, step)

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까지 출력할 수 있었다.

문제 링크

https://www.acmicpc.net/problem/1929

0개의 댓글