코딩일지/python 백준 알고리즘

python 백준 알고리즘 9020번: 골드바흐의 추측

야언 2022. 9. 15. 17:26

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

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

 

일단 소수를 구하는 함수를 만들어놓고 두 소수의 차이가 가장 작은것을 출력해야하니 a, b를 각각 num // 2 으로 중간점부터 비교하는 식으로 구상해보았다.

 

내 제출

from math import sqrt

def prime(n):  # 소수 구하기 함수
    if n == 1:
        return False
    for i in range(2, int(sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

for _ in range(int(input())):  # test case만큼 반복문
    num = int(input())

    a, b = num//2, num//2  # 중간점부터 비교
    while a > 1:  # a를 -1 해나가니까 1보다 작아지면 안된다.
        if prime(a) and prime(b):
            print(a, b)
            break
        else:
            a -= 1
            b += 1

 

 

 

다른 방법이 있나 찾아보다가 정석적인 방법인것 같아 스크랩

n의 영역까지 소수 리스트를 만들어서 각 골드바흐 수를 딕셔너리 자료형으로 정리해 두 값의 차의 미니멈을 출력하는 방식

from math import sqrt

def prime(n):  # 소수 구하기
    if n == 1:
        return False
    for i in range(2,int(sqrt(n))+1):
        if n % i == 0:
            return False
    return True

numbers = list(range(2,10001))  # 제한 영역까지
prime_list = set()

for i in numbers:
    if prime(i):
        prime_list.add(i)  # 소수 리스트 만들어놓기

t = int(input())  # test case

for k in range(t):
    k = int(input())
    dic = {}

    for i in prime_list:
        if k - i in prime_list:  # k에서 소수 i를 뺀값이 소수리스트에 있으면
            if i <= k - i:  # 첫번째 값이 입력받은 값보다 작거나 같을 때
                dic[(k - i) - i] = [i, k - i]  #  딕셔너리에 두값의 차를 키로하여 두 값 리스토로 저장

            else:
                dic[i - (k - i)] = [k - i, i]

    key_list = list(dic.keys())  # 두값의 차이들만 모아서 차이 리스트 생성
    print(dic[min(key_list)][0], dic[min(key_list)][1])  #두 소수의 차이가 가장 작은 것만 가져와서 하나씩 출력