본문 바로가기
백준알고리즘/기본 수학2

(Python/🥈1)백준 알고리즘 9020번: 골드바흐의 추측

by windy7271 2022. 5. 17.
728x90
반응형

문제 출처:https://www.acmicpc.net/problem/9020

 

9020번: 골드바흐의 추측

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

www.acmicpc.net

잘못된 풀이:

array = list()
for i in range(2,10000):   
    count = 0

    for j in range(2,i):
        if i % j == 0:
            count += 1
            break
    if count == 0:
        array.append(i)

T=int(input())

for i in range(T):
    n = int(input())
    a = int(n//2)
    b = a
    while a>0:
        if array[a] and array[b] :
            break
        else:
            a -= 1
            b += 1

지금까지 푼 문제중에 가장오래걸렸다 2시간넘게는 쓴거같다..

 

2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것 

이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다

 

접근 방식은 만약 20 이라는 짝수를 받으면 1/2 을 한 수를 a,b두개로 만든다 10 10 으로 

두 수의 합이 20이 맞지만 소수가 아니기 때문에  a는 -1을 b는 +1 을 계속 해주면서 찾아준다.

 

이런 접근방식은 맞지만 중간 if문에 a와 b를 넣으면 0이 아닌이상 true 가 나오기 때문에 else문은 발동하지 않는다.

 

그래서 에라토스테네스의 체 를 사용해 false 와 true 로 이루어징 소수 리스트를 만들었다.

 

T=int(input())

array = [False,False] + [True] * 10000
for i in range(2,101):
    if array[i] == True:
        for j in range(i+i, 10001, i):		# 배수들 제거
            array[j] = False
for i in range(T):
    n = int(input())
    a = int(n//2)
    b = a
    while a>0:
        if array[a] and array[b] :
            # print(a,b)
            break
        else:
            a -= 1
            b += 1

 

숫자 0과 1은 false 즉 소수가 아니고 true 인 리스트 10000개를 만들어주고

각 숫자들의 배수들을 하나하나 지워나가면 결국 True는 소수만 남는다.

반응형

댓글