1
+ """
2
+ 골드바흐의 추측
3
+
4
+ 풀이시간
5
+ 20:44 ~ 21:28 (44분)
6
+
7
+ 문제 조건
8
+ 4 <= N <= 10,000
9
+ 2 <= target <= 10,000인 짝수
10
+
11
+ 시간 복잡도 :
12
+ O(값 입력 + 에라토스테네스의 체 만들기 + 골드바흐의 파티션 찾기)
13
+
14
+ 접근법
15
+ 무슨 알고리즘으로 풀이 할 수 있을까? -> 구현
16
+
17
+ 1. 입력 받은 케이스 중 최대 값까지의 소수를 구하기 - 에라토스테네스의 체
18
+ 2. 골드바흐 파티션 찾기 -> 두 소수의 차이가 가장 작은 것을 출력
19
+ - 가장 작은 소수 값부터 확인하며
20
+ - 작은 소수 값이 먼저 나오며 target 값에서 작은 소수 값을 제외한 값이 소수일 경우 중
21
+ - 두 소수의 차이가 최소일 경우 정답에 두 소수의 값 업데이트
22
+
23
+ """
24
+ import sys
25
+ from collections import defaultdict
26
+
27
+ input = sys .stdin .readline
28
+
29
+ # Inputs
30
+ N = int (input ())
31
+
32
+ ## 정답
33
+ answer = [0 ] * N
34
+
35
+ ## 입력받은 최대 정수
36
+ max_value = 0
37
+
38
+ ## 입력받는 테스트 케이스 값
39
+ targets = []
40
+
41
+ # 테스트 케이스 입력 받기
42
+ for _ in range (N ):
43
+ target = int (input ())
44
+ targets .append (target )
45
+
46
+ # 최대 값 확인 및 업데이트
47
+ if target > max_value :
48
+ max_value = target
49
+
50
+ # 1. 최대 값까지 에라토스테네스의 체 만들기
51
+ table = [False , False ] + [True ] * (max_value - 1 )
52
+
53
+ ## defaultdict를 사용한 이유 입력한 순서를 기억하고 in 연산의 시간 복잡도를 O(1)로 만들기 위해서
54
+ prime_numbers = defaultdict (bool )
55
+
56
+ ## 2 이상 max_value 이하의 값까지 소수 확인 -> 10,000개까지 총 1229개의 소수
57
+ for num in range (2 , max_value + 1 ):
58
+ if table [num ]:
59
+ prime_numbers [num ] = True
60
+ for n in range (num , max_value + 1 , num ):
61
+ table [n ] = False
62
+ # print(prime_numbers.keys(), len(prime_numbers), max(prime_numbers))
63
+
64
+ # 2. 골드바흐의 파티션 찾기 -> 답이 무조건 있음 예외처리 필요 없음
65
+ for idx , target in enumerate (targets ):
66
+ min_gap = 100001
67
+ # 소수 중에서
68
+ for p_num in prime_numbers .keys ():
69
+ # 작은 소수 값이 먼저 나오며 target 값에서 작은 소수 값을 제외한 값이 소수일 경우 -> 골드바흐의 파티션
70
+ if (p_num <= target - p_num ) and (target - p_num ) in prime_numbers :
71
+ # 만약 두 소수의 차이가 최소일 경우 정답 업데이트
72
+ if target - (2 * p_num ) < min_gap :
73
+ min_gap = target - (2 * p_num )
74
+ answer [idx ] = (p_num , target - p_num )
75
+
76
+ for row in answer :
77
+ print (* row )
0 commit comments