백준 9020번 python 풀이 - 골드바흐의 추측
문제 링크
해결책
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from math import sqrt
def isprime(n):
if n == 1:
return False
elif n == 2:
return True
elif n % 2 == 0:
return False
else:
for j in range(3, int(sqrt(n)) + 1, 2):
if n % j == 0:
return False
return True
T = int(input())
for t in range(T):
N = int(input())
for i in range(int(N / 2), N):
if isprime(i):
if isprime(N - i):
print(N - i, i)
break
주석으로 달 설명
이번 결과는 예상과 달랐다.
먼저, 편한 방식으로 진행했다. 이전 문제인 9번에서 소수인지를 확인하는 함수를 가져왔고, 이를 기반으로 N/2 부터 N-1 중 소수인 것을 N에서 뺀 숫자 역시 소수인지 확인하는 방법으로 진행하였고, 시간은 조금 걸렸지만 해결되었다.
그 다음에 생각한 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from math import sqrt
def isprime(n):
if n == 1:
return False
elif n == 2:
return True
elif n % 2 == 0:
return False
else:
for j in range(3, int(sqrt(n)) + 1, 2):
if n % j == 0:
return False
return True
T = int(input())
for t in range(T):
N = int(input())
primeList = []
for i in range(2, N - 1):
if isprime(i):
primeList.append(i)
for i in range(int(len(primeList) / 2), len(primeList)):
if (N - primeList[i]) in primeList:
print(N - primeList[i], primeList[i])
break
이는 소수 리스트를 1~N까지 먼저 만들고, 이를 기반으로 확인하는 방법이다. 이는 재밌게도, Timeout Error가 등장했다.
하지만 두번째 풀이에서 len(primeList)의 중간값이 반드시 N의 중간 즈음이 아니기 때문에 생각이 잘못되었던 것 같다. 추후 수정을 추가해 해결해보겠다.
This post is licensed under CC BY 4.0 by the author.