STUDY/Algorithm

[백준] 9020 골드바흐의 추측

sinawi95 2021. 2. 12. 13:20
728x90

www.acmicpc.net/problem/9020

 

9020번: 골드바흐의 추측

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

www.acmicpc.net

import sys
input = sys.stdin.readline

#에라토스테네스의 체로 소수를 먼저 구함
max_number= 10000
prime=[False,False,]+[True]*(max_number - 1)
for i in range(2,int(max_number**0.5)+1):
    if prime:
        for j in range(2*i,max_number+1,i):
            prime[j] = False
prime_num = [i for i,v in enumerate(prime) if v] #1229개

t = int(input())
for tc in range(1, t + 1):
    n = int(input())
    # n을 2로 나눈 수에서 가장 큰 소수부터 2까지 확인, (n-i) 가 소수인지확인
    for i in range(n//2,1,-1): # n=4, i=2
        if prime[i] and prime[n-i]:
            s,b = i, n-i
            break
    print(f"{s} {b}")



에라토스테네스의 체로 소수를 먼저 구하고, 이후에 짝수들의 골드바흐 파티션을 찾았다. 골드바흐 파티션이란 해당 수가 두 소수의 합으로 이루어질때 두 소수를 뜻한다.

골드바흐 파티션에서 두 소수의 차이가 가장 작은 것을 출력해야하기 때문에 중간부터 비교를 해야한다는 생각을 했다.

그래서 범위를 중간부터 2까지 잡아서 반복문을 돌렸다. range(n//2,1,-1)

반복문 안에서 숫자가 소수(prime[i] == True) 이면, 반대수(n-i)가 소수인지 확인하였고, 가장 먼저 찾는 골드바흐 파티션이 차이가 가장 작기때문에 break으로 멈추었더니 해결되었다.

 

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 11729 하노이 탑 이동 순서  (0) 2021.02.14
[백준] 1002 터렛  (0) 2021.02.12
[백준] 4948 베르트랑 공준  (0) 2021.02.12
[백준] 1929 소수구하기  (0) 2021.02.12
[백준] 11653 소인수분해  (0) 2021.02.12