파이썬 알고리즘 107 번 | [백준 4948번] 베르트랑 공준

Yunny.Log ·2022년 1월 26일
0

Algorithm

목록 보기
109/318
post-thumbnail

107. 베르트랑 공준

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

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

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

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

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

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

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

제한
1 ≤ n ≤ 123,456
예제 입력 1
1
10
13
100
1000
10000
100000
0
예제 출력 1
1
4
3
21
135
1033
8392

1) 어떤 전략(알고리즘)으로 해결?

=> 내가 사랑하는 에라스토테네스 체 방식으로 접근

2) 코딩 설명

=> arr은 입력받은 n을 담는 배열 (입력값 담는 배열)

=> 최대한 시간 복잡도를 줄이기 위해서 주어진 입력값들 중 가장 maximum 값을 데려와서 얘 기준으로 미리 maximum*2 까지 중 소수를 0으로 설정 (소수 아닌건 1로 체크) 해서 소수들을 구해놓았다 (arr2), 이때도 arr[1]=1이라고 사전에 설정해두어야 함

  • (for i in range (2~)로 할거라서 1은 1로 바뀌지 않기 때문이지)

=>

<내 풀이>


arr=[0]*100000
i=0
cnt=0
cntSosu=0

n=int(input())
while n!=0 :
    arr[i]=n
    i+=1
    cnt+=1
    n=int(input())
maxnum = max(arr)*2
#가장 큰 수를 기준으로 미리 소수 다 구해놓기

arr2=[0]*(maxnum+1)
arr2[1]=1
for i in range(2,maxnum+1) :
    if arr2[i]==0:
        for j in range(i*2,maxnum+1, i) :
            arr2[j]=1

for i in range(cnt) :
    cntSosu=0
    for j in range(arr[i]+1, arr[i]*2+1) :
        if arr2[j]==0 :
            cntSosu+=1
    print(cntSosu)

<내 틀린 풀이, 문제점>


arr=[0]*100000
i=0
cnt=0
cntSosu=0

n=int(input())
while n!=0 :
    arr[i]=n
    i+=1
    cnt+=1
    n=int(input())
maxnum = max(arr)*2
#가장 큰 수를 기준으로 미리 소수 다 구해놓기

arr2=[0]*(maxnum)
arr2[1]=1
for i in range(2,maxnum) :
    if arr2[i]==0:
        for j in range(2*i,maxnum, i) :
            arr2[j]=1
for i in range(cnt) :
    cntSosu=0
    for j in range(arr[i]+1, arr[i]*2) :
        if arr2[j]==0 :
            cntSosu+=1
    print(cntSosu)

=> 문제를 잘못 읽었다. 2n 보다 작거나 같은!! 이 조건인데 작다는 조건으로 풀었더니 실수를 하게 되었다.
1) 마지막 코드 부분에서 range 부분에 있는 maxnum에 1을 더해줘서 maxnum까지 포함되도록 수정해야 하고

2)

    for j in range(arr[i]+1, arr[i]*2) :
        if arr2[j]==0 :
            cntSosu+=1
    print(cntSosu)

=> 이 부분에서 arr[i]*2 에다가 1을 더해줘서 해당 2n 과 같은 값도 고려될 수 있도록 해야 한다.

<반성 점>

  • 문제를 꼼꼼히 읽자

<배운 점>

  • 오랜만에 max 함수를 사용했다, max를 변수명으로 하면 에러난다.

0개의 댓글