코딩테스트/기초

백준 9020 골드바흐의 추측 - python

math_tbro 2022. 1. 11. 20:11

출력:

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

 

9020번: 골드바흐의 추측

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

www.acmicpc.net

풀이:

<내풀이>

def prime_list(n):
    prime = [True] * (n+1)
    
    m = int(n**0.5)
    if n <= 3:
        prime[0] = False   # f t t t
        return [i+1 for i in range(n) if prime[i]==True ]
    else:
        for i in range(2,m+1):
            if prime[i] == True:
                for j in range(i+i,n+1,i):
                    prime[j]=False
        return [i for i in range(2,n+1) if prime[i]==True]  
            
t = int(input())

for _ in range(t):
    a = int(input())
    b = prime_list(a)
    hubo = []
    d = []
    for i in b:
        for j in b:
            if i+j == a:
                if i <= j :
                    hubo.append([i,j])
                    d.append(j-i)
    ans = hubo[d.index(min(d))]
    print(ans[0], ans[1])

<다른 사람풀이>

prime_list = [False, False] + [True]*10002

for i in range(2,10002):
    if prime_list[i]:
        for j in range(i+i,10002,i):
            prime_list[j] = False
            
T = int(input())

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

 

내가 이전에 계속 쓰던 리스트로 풀어서 밑과정에서 아무리 과정을 줄여도 출력되지가 않았다. 여기에는 올리지 못하고 지워버렸지만 긴시간 계속 다양하게 해봤는데 실패해서.. 결국 다른 답을 참고해서 수정했다.

 

1. 일단 0 1은 소수가 아니니까 False 로 만들어놓고 이 문제에서 제안한 수 보다 조금 더 많게 True 리스트를 만들어놓는다.

그 다음 에라토스테네스의 체를 이용해서 첫 소수의 배수들은 다 False로 바꿔준다.

 

2. 그 다음은 입출력을 받아주고

 

3. 이 과정이 좀 중요하다. 입력값에 답을 구하려면 입력값을 절반으로 나눠준 뒤에 두 개로 나뉜 값에 각각 -1 +1 을 더해주면 그 둘의 합은 어차피 입력값이 된다. ( a / 2.  a/ 2.     ->  a/2-1, a/2 +1   -> 결국은 합이 a 

 

4. 위와 같은 방식으로 진행할것이고 여기서 반으로 나누고 -1, +1 을 하면서 그 수가 소수가 된다면 그 값은 문제의 답일 것이다.

그래서 while 문에서 두 수가 소수라면 출력하고 멈추고 그것이 아니라면 a는 -1 b는 +1 을 더해준다.