Algorithm & Data Structure

[백준] 베르트랑 공준(4948번) - Python

후뿡이 2022. 12. 27. 18:14

중요 개념


1. 소수 탐색

2. 이분탐색법

 

소스코드


import sys

def prime(n):
    sieve = [True] * (n+1)
    for i in range(3,int(n**.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i] = [False]*len(sieve[i*i::2*i])
    return [2] + [i for i in range(3,n+1,2) if sieve[i]]

def Search(prime, n):
    l,r = 0, len(prime)-1
    while l<=r:
        m=(l+r)//2

        if prime[m] > n:
            r = m-1
        else:
            l = m+1
    return l

primeList = prime(123456*2)

while True:
    input = int(sys.stdin.readline().strip())
    if input!=0:
        print(Search(primeList,input*2) - Search(primeList,input))
    else:
        break

 

 

 

코드 설명


def prime(n:int)->list:
    sieve = [True] * (n+1)
    for i in range(3,int(n**.5)+1,2):
        # 홀수에 대해서만 생각
        if sieve[i]:
            sieve[i*i::2*i] = [False]*len(sieve[i*i::2*i])
            # sieve[i]는 소수 이므로 true이고 seive[i*i] 부터는 소수가 아니다
            # 홀수만 생각하므로 2*i씩 건너 뛴다
    return [2] + [i for i in range(3,n+1,2) if sieve[i]]

prime 함수는 n을 인수로 받아서 n 이하의 소수 list를 리턴한다.

seive (거름망) 

seive list의 index를 해당 숫자로 생각한다.

마지막 return에서 range(3,n+1,2)로 설정해 줌으로써 짝수는 배제하고 n을 포함한 소수 list를 return한다.

 

 

def Search(prime, n):
    left,right = 0, len(prime)-1
    while left<=right:
        #종료 조건 
        m=(left+right)//2

        if prime[m] > n:
            # 찾는 값이 left와 right의 사이보다 오른쪽에 있는 경우
            right = m-1
        else:
            # 찾는 값이 left와 right의 사이보다 왼쪽에 있는 경우
            left = m+1
    return left

Search 함수는 인수로 소수list인 prime과 정수형 변수 n을 받는다.

Search 함수는 prime list에서 n 이하인 최대 소수의 index를 return한다.

 

Search 함수는 이분 탐색 법을 사용하는데 이 문제에서 시간을 대폭으로 줄여줄 수 있다.

 

쉽게 생각하면 소주병 뚜껑으로 하는 UpDown 문제처럼 생각하면 될 것 같다.