알고리즘

[백준] 4948 베르트랑 공준

유노비 2023. 10. 17. 22:41
반응형
import math
import sys

data = []
while True:
    n = int(sys.stdin.readline().rstrip())
    if n == 0: # 마지막 테스트케이스가 나오면 중단하기
        break
    data.append(n)

decimal = set(range(min(data) + 1, max(data)*2 + 1)) # 테스트케이스 중 가장 작은 수 ~ 가장 큰수의x 2 의 범위까지에 존재하는 소수를 구한다
for i in range(2, int(math.sqrt(max(data)*2))+1): # 2 ~ 루트M(=M의 약수들 중에서 중간값) 까지 증가시킨다. (<-에라토스테네스의 체 방식)
    remove_element = set(range(i,(max(data)*2)+1,i)) # 2~ 루트M까지의 수의, 배수 set 을 생성
    remove_element.discard(i)
    decimal = decimal - remove_element # 2~ 루트M까지의 수의, 배수를 제거한다

decimal.discard(1) # 1이 포함되어있을 경우 삭제하기

for i in data:
    print(len(list(filter(lambda x: x > i and x <= (i*2), decimal)))) # 각 테스트케이스마다 존재하는 소수의 갯수 구하기​
반응형