https://www.acmicpc.net/problem/17103
골드바흐 파티션 문제는 짝수 \( n \)을 두 소수의 합으로 표현하는 방법의 개수를 찾는 문제이다. 골드바흐의 추측에 따르면, 2보다 큰 모든 짝수는 두 소수의 합으로 표현될 수 있다. 이 문제에서는 주어진 짝수 n 에 대해, 두 소수의 합으로 n을 나타내는 모든 경우의 수를 찾아 출력하는 게 목표이다.
처음에는 단순하게 for문으로 순서대로 돌면서 n-i와 i가 둘 다 소수인지 판별하도록 코드를 짰다.
그런데 시간초과에 걸렸다.
그래서 미리 1000000까지의 소수를 배열에 저장해놓고 배열을 체크하는 식으로 구현했다.
코드 풀이
import sys
import math
def is_primenum(x):
if x == 1:
return False
for i in range(2, int(math.sqrt(x)) + 1):
if x % i == 0:
return False
return True
list = [False] * 1000000
for i in range(1, 1000000):
if is_primenum(i):
list[i] = True
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
num = 0
for i in range(1, n//2 + 1):
if list[n - i] and list[i]:
num += 1
print(num)
1. `is_primenum` 함수는 주어진 수가 소수인지 아닌지를 판별.
2. 1부터 1,000,000까지의 소수를 미리 계산해 `list`에 저장. 소수면 `True`, 소수가 아니면 `False`로 표시.
3. 테스트 케이스마다 n 을 입력받고, i 와 n-i 가 모두 소수인 경우를 찾아 그 개수를 세어 출력.
'PS > 수학' 카테고리의 다른 글
[백준] 13909번: 창문 닫기 파이썬 (0) | 2024.09.19 |
---|---|
[백준] 4134번: 다음 소수 파이썬 (1) | 2024.09.06 |
[백준]2485번: 가로수 파이썬 (0) | 2024.09.05 |
1735번: 분수 합 파이썬 (0) | 2024.09.04 |
[백준] 13241번: 최소공배수 파이썬 (3) | 2024.09.03 |