Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.

Commit f98f19c

Browse files
committed
Create 골드바흐의 추측 wooyeol.py
1 parent 220e5e8 commit f98f19c

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

BOJ/골드바흐의 추측/wooyeol.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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

Comments
 (0)