[BOJ][⚪1][백준#09020] 골드바흐의 추측

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #9020


문제

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다. 골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다. 2보다 큰 짝수 n이 주어졌을 때, n의 골드바흐 파티션을 출력하는 프로그램을 작성하시오. 만약 가능한 n의 골드바흐 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력한다.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고 짝수 n이 주어진다.


출력

각 테스트 케이스에 대해서 주어진 n의 골드바흐 파티션을 출력한다. 출력하는 소수는 작은 것부터 먼저 출력하며, 공백으로 구분한다.


제한

4 ≤ n ≤ 10,000


예제

입력

3
8
10
16


출력

3 5
5 5
5 11


My Sol

import sys
input = sys.stdin.readline

M = 10000
v = [1]*(M+1)
v[0] = v[1] = 0
for i in range(2, M+1):
    if v[i]:
        for j in range(i+i, M+1, i):
            v[j] = 0

T = int(input())
for _ in range(T):
    h = int(input())//2
    a = b = h
    while not (v[a] and v[b]):
        a -= 1
        b += 1
    print(a, b)

소수 확인 함수를 만들어볼까도 싶었지만, 여러 테스트 케이스가 있는 동안 계속 반복하는 것은 자원 낭비이고, 소수 범위의 크기도 10000 밖에 되지 않았기 때문에 에라토스테네스의 체를 이용해 처음에 소수 체크리스트를 만들었다.

이후 입력되는 n의 절반인 h부터 시작하여 양쪽으로 1씩 벌어지면서 둘 다 소수인 경우에 멈추는 while문을 실시하고 작은 값과 큰 값을 출력하면 되겠다.


결과

맞았습니다!!


모범답안

출처

# empty

댓글남기기