반응형

-내가 푼 풀이(시간초과)

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문이 돌아갈때 마다 에라토스테네스의 체를 다시 구해서 그런듯하다.  숏코딩도 봤는데, 생각보다 가독성이 좋아서 이러한 방법도 괜찮은 것 같다.

+ Recent posts