[Algorithm] 백준 4948번 베르트랑 공준(파이썬)

고플래닛·2021년 7월 6일
0

Algorithm

목록 보기
12/40
post-thumbnail

백준 #4948

문제 바로가기


문제

:베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.
이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.
예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)
자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오.

입출력 규칙

1. 입력

  • 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.
    입력의 마지막에는 0이 주어진다.

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

문제접근

이번 문제는 임의의 자연수 n에 대하여 n보다 크고 2n보다 작거나 같은 소수의 개수를 출력해야하므로, 일정 범위 내의 소수를 구한 후 카운트하는 방법으로 접근하였다.

  1. 우선 math 모듈의 sqrt 함수를 사용하려 하므로, math 모듈을 import 한다.
  2. 소수를 구하는 함수 check를 만들고, 1은 소수가 아닌 것을 알기에 2부터 시작하도록 한다. 그리고 소수인 2부터 입력받은 값의 제곱근까지만 약수 여부를 판단하면 되므로, sqrt함수를 이용한다.
  3. 문제의 범위를 1 ≤ n ≤ 123,456 으로 제한했고 2n보다 작거나 같다고 했으므로, 범위를 2 ≤ n ≤ 246,912까지의 숫자를 리스트에 담아 변수를 선언한다.
  4. 소수를 판별하는 함수인 check를 통해 전체 범위의 소수를 구하고, 해당 소수를 담을 수 있는 빈 배열의 변수에 추가하여 소수만을 담을 수 있도록 한다.
  5. 입력값이 들어오면 반복문을 통해 소수를 담은 리스트에서 입력받은 값의 범위 안에 있는 소수가 있다면, 값을 0으로 설정해준 count 변수에 +1씩 추가하여 갯수를 구할 수 있도록 한다.

문제풀이(Python)

import math

def check(num):  
    if num == 1:
        return False
    else:
        for i in range(2, int(math.sqrt(num)+1)):
            if num%i == 0:
                return False
        return True

natural_list = list(range(2, 246912))  
decimal_list = []

num = int(input())

for i in natural_list:
    if check(i):
        decimal_list.append(i)

while num != 0:    
    count = 0
    for i in decimal_list:
        if num < i <= num*2:  
            count += 1
    print(count)
    num = int(input())

풀이를 통해 배운 것

  • 제곱근을 구할 수 있는 math 모듈의 sqrt 함수를 배울 수 있었다.
profile
blog 이사했습니다. 주소 : https://goplanit.site/

0개의 댓글