백준

[백준] 4948 : 베르트랑 공준 (Python/파이썬)

sson-coding 2025. 12. 8. 13:46

문제 링크

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

문제

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 
2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.

이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.

예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 
또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)

자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 
프로그램을 작성하시오. 

- 제한
1 ≤ n ≤ 123,456

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.

입력의 마지막에는 0이 주어진다.

출력

각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.

예제

입력

1
10
13
100
1000
10000
100000
0

출력

1
4
3
21
135
1033
8392

정답 및 풀이

import sys
input = sys.stdin.readline

MAX = 246912
prime = [True] * (MAX + 1)
prime[0] = prime[1] = False

for i in range(2, int(MAX**0.5) + 1):
    if prime[i]:
        for j in range(i * i, MAX + 1, i):
            prime[j] = False

while True:
    n = int(input())
    if n == 0:
        break
    print(sum(prime[n+1 : 2*n + 1]))

  1. import sys
    • sys 모듈을 불러와 빠른 입력을 사용할 준비를 한다.
  2. input = sys.stdin.readline
    • 기본 input() 대신 더 빠른 입력 방식으로 변경한다.
    • 많은 줄을 입력받는 문제에서 속도 향상에 효과적이다.
  3. MAX = 246912
    • n의 최대값이 123456이므로 (n, 2n]의 최대값 246912를 설정한다.
    • 이 범위까지 소수를 미리 구해두기 위해 MAX를 지정한다.
  4. prime = [True] * (MAX + 1)
    • 0부터 MAX까지 모든 수를 처음에는 소수(True)라고 가정하고 리스트를 만든다.
  5. prime[0] = prime[1] = False
    • 0과 1은 소수가 아니기 때문에 False로 설정한다.
  6. for i in range(2, int(MAX**0.5) + 1):
    • 에라토스테네스의 체에서 i는 2부터 √MAX까지만 확인하면 충분하다.
    • √MAX 이후의 수는 이미 그보다 작은 소수의 배수 처리에 포함되기 때문이다.
  7. if prime[i]:
    • i가 소수(True)라면 그 다음 단계인 배수 제거를 수행한다.
    • i가 False이면 이미 합성수이므로 건너뛴다.
  8. for j in range(i * i, MAX + 1, i): prime[j] = False
    • i의 배수들을 모두 소수가 아니라고 표시한다.
    • i*i부터 시작하는 이유는 그보다 작은 배수는 이미 이전 소수 단계에서 처리되었기 때문이다.
  9. while True:
    • 여러 개의 입력을 처리하기 위해 무한 반복문을 사용한다.
  10. n = int(input())
    • 사용자로부터 정수 n을 입력받는다.
  11. if n == 0: break
    • 입력이 0이면 문제 조건에 따라 반복문을 종료한다.
  12. print(sum(prime[n+1 : 2*n + 1]))
    • prime 리스트에서 (n, 2n] 범위 내 True 값(=소수)을 모두 더해 개수를 출력한다.
    • True는 1로 계산되므로 소수 개수를 바로 확인할 수 있다.

새롭게 배운 내용 및 느낀점

  • 에라토스테네스의 체
    • 소수가 아닌 수들을 하나씩 지워 나가면서, 남는 숫자를 소수로 판별하는 방법
    • 소수의 배수는 모두 소수가 아니므로 제거한다 → 원리를 이용한 알고리즘