코딩 연습/Python

백준_9020: 골드바흐의 추측

썬2 2022. 2. 5. 00:27

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

 

9020번: 골드바흐의 추측

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

www.acmicpc.net

 

 

내 코드:

import sys
n = int(input())
nums = []
for i in range(n):
    nums.append(int(sys.stdin.readline()))

def isPrime(x):
    if x == 1:
        return False
    for i in range(2, x):
        if x%i==0:
            return False
    return True

for target in nums:
    for x in range(target//2, 1, -1):
        if isPrime(x) and isPrime(target-x):
            print(x, target-x)
            break

맞게 나왔지만 상당히 비효율적인 것 같다.

 

Best Code:

sosu = [0 for i in range(10001)]
sosu[1] = 1
for i in range(2, 10001):
    for j in range(i * 2, 10001, i):
        sosu[j] = 1 # 소수가 아니므로 1 넣기
        
t = int(input())

for i in range(t):
    a = int(input())
    b = a // 2
    for j in range(b, 1, -1):
        if sosu[a - j] == 0 and sosu[j] == 0:
            print(j, a - j)
            break

 

포인트:

1. 소수 판별시에는 '에라토스테네스의 체'를 활용하자!! -> 시간복잡도가 1/7배로 줄어든다.

 

 

에라토스테네스의 체란?

https://ko.wikipedia.org/wiki/에라토스테네스의_체

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서

ko.wikipedia.org

위 위키백과에 잘 나와있듯이,

2부터 자기 자신을 제외한 2의 배수를 모두 지운다. 남아있는 수들 중에서 차례대로 자기 자신ㅇ르 제외한 배수들을 모두 지우면 된다.

 

 

참고:

https://pacific-ocean.tistory.com/129

 

[백준] 9020번(python 파이썬)

문제 링크: https://www.acmicpc.net/problem/9020 9020번: 골드바흐의 추측 문제 1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수

pacific-ocean.tistory.com

 

'코딩 연습 > Python' 카테고리의 다른 글

[leetcode] 121. Best Time to Buy and Sell Stock  (0) 2022.03.14
[HackerRank] Between Two Sets  (0) 2022.02.12
백준_11508: 2+1 세일  (0) 2022.02.03
백준_11657: 타임머신  (0) 2022.01.30
딕셔너리 정렬하기  (0) 2022.01.01