Skip to content

에라토스테네스의 체 파이썬 소수찾기 백준1929번

에라토스테네스의 체 백준 1929번 문제 바로가기

백준 1929번 소수 구하기는 에라토스테네스의 체를 이용하여 주어진 범위 안의 소수를 구하는 문제이다.

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

문제를 접하고 우선 에라토스테네스의 체에대한 이해가 필요했기에 구글링을 했다. 아래 이미지는 에라토스테네스의 체의 원리를 이해하기 쉽게 보여준다.

출처https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4
  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

그림의 경우, {\displaystyle 11^{2}>120}{\displaystyle 11^{2}>120}”>이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.</p>



<p>위의 이미지와 설명만 보고도 대충 어떠한 알고리즘으로 소수를 구하는지 알 수 있다. 이미지 출처를 클릭하여 위키백과에 접속하면 아레토스테네스의 체를 여러 프로그래밍 언어로 구현한 예들이 나와있다. 이를 참고해 문제를 풀이하면 쉽게 해결할 수 있다.</p>



<p>내가 제출한 답안은 이렇다.</p>



<div class=

M, N = map(int, input().split())

def prime_list(n):
    sieve = [True] * (n + 1)
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:
            for j in range(i + i, n + 1, i):
                sieve[j] = False
    return [i for i in range(M, n + 1) if sieve[i] == True]
li = prime_list(N)
if 1 in li:
    li.remove(1)
    for k in li:
        print(k)
else:
    for _ in prime_list(N):
        print(_)

그렇게 깔끔하지는 않지만 원리를 잘 보여준다고 생각하여 따로 수정하지는 않았다.

처음에 여러번 시간초과와 오답이라는 체점결과를 받았는데 시간초과는 에라토스테네스의 체를 이용하면 쉽게 해결되었고, 1이 출력되는 반례가 존재하여 소스코드 중간부에서 이를 수정했다.

이번에도 문제 게시판의 여러 질문과 답변을 참고해 많은 도움을 받았다. 소수 구하기 문제에 대한 팁도 있으므로 아래의 링크를 한번 들어가 훑어보는것을 추천한다.

백준 게시판 소수구하기 (에라토스테네스의 체) FAQ

이외에도 다양한 소수관련 문제들이 등장하는데 소수도 합성수도 아닌 1을 유의하며 소수관련 문제를 푸는 습관을 들이자.

계속된 시간초과로 시간복잡도에 대한 개념도 되도록 깊게 이해하고 문제를 풀는것이 좋겠다고 생각했다. 시간복잡도에 대해 공부 해봐야겠다.

Leave a Reply

Your email address will not be published. Required fields are marked *