-내가 푼 풀이(시간초과)
import math
from sys import stdin
input = stdin.readline
while True:
b = int(input())
if b == 0:
break
hol = []
answer = []
#모든 수에 대하여 소수 판별
array = [False, False]+[True]*(b-1) # 처음엔 모든 수가 소수(True)인 것으로 초기화
# 에라토스테네스의 체 알고리즘
for i in range(2, int(math.sqrt(b)) + 1): # 2부터 b의 제곱근까지의 모든 수를 확인하며
if array[i] == True: # i가 소수인 경우 (남은 수인 경우)
# i를 제외한 i의 모든 배수를 지우기
j = 2
while i * j <= b:
array[i * j] = False
j += 1
# a부터 b의 모든 소수 출력
for i in range(2, b + 1):
if array[i]:
hol.append(i)
for j in range(len(hol)):
for k in range(j+1, len(hol)):
if j+1 >= len(hol):
continue
else:
if hol[j]+hol[k] == b:
answer.append([hol[j],hol[k]])
if len(answer) >= 2:
answer = sorted(answer, key=lambda x:-(x[1]-x[0]))
print(b, "=", answer[0][0], "+", answer[0][1])
elif len(answer) == 1:
print(b, "=", answer[0][0], "+", answer[0][1])
elif len(answer) == 0:
print("Goldbach's conjecture is wrong.")
-풀이
import math
from sys import stdin
input = stdin.readline
num = 1000001
arr = [True for _ in range(num)]
for i in range(2, int((num-1)**0.5)+1):
if arr[i]:
for k in range(i+i, num, i):
arr[k] = False
while True:
b = int(input())
if b == 0:
break
flag = 0
for a in range(3, len(arr)):
if arr[a] and arr[b-a]:
print(str(b) + " = " + str(a) + " + " + str(b-a))
flag = 1
break
if flag == 0:
print("Goldbach's conjecture is wrong.")
-풀이 설명(느낀점)
[30분 no sol] 내가 푼 풀이로 하니 시간초과가 떴다. 그 원인으로는 리스트를 계속 만들고 이중 반복문을 사용하고, while문이 돌아갈때 마다 에라토스테네스의 체를 다시 구해서 그런듯하다. 숏코딩도 봤는데, 생각보다 가독성이 좋아서 이러한 방법도 괜찮은 것 같다.
'알고리즘' 카테고리의 다른 글
[DP] 백준 11727 파이썬 (2 x n 타일링2) 실버3 (0) | 2021.11.11 |
---|---|
[DP] 백준 11726 파이썬 (2 x n 타일링) 실버3 (0) | 2021.11.11 |
[수학] 백준 2004 파이썬 (조합 0의 개수) 실버2 (0) | 2021.11.10 |
[수학] 백준 1676 파이썬 (팩토리얼 0의 개수) 실버4 (0) | 2021.11.09 |
[수학] 백준 11653 파이썬 (소인수분해) 실버4 (0) | 2021.11.09 |