6588번: 골드바흐의 추측
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰
www.acmicpc.net
내가 처음에 생각한 방법은,
2부터 입력받은 num값 범위 까지 소수인 애들을 리스트로 뽑은 후에,
리스트에 for 문 돌려서 -> if num-list[i] in list
num-list[i] 가 list안에 존재하면, print(num = (num-list[i]) + (num-(num-list[i])) 이렇게 나오게 작성했다.
함수로 작성해서 값이 하나만 나오게까지 고쳤는데, 내가 원하는건 3+17인데 7+13이 나와버리는 것이다.
(아직도 저건 어떻게 고쳐야하는지 모르겠음)
인터넷을 찾아보니 '에라토스테네스의 체' 라는 것을 활용해서 푼다는데,
도대체 먼말인지 모르겠음
그래서 내가 짜논 코드를 어떻게든 살릴 수 없나 고민하다가
같이 코테 스터디하는 친구가 비스므레한 방법으로 풀었길래 나도 활용해보았다!
나의 첫 코드는 무식하게 함수 하나를 풀로 돌렸는데,
소수를 구하는 함수와 출력문을 따로 분리했다.
import sys
def sosu(num):
if num ==1:
return False
else:
for i in range(2, int(num**0.5)+1):
if num%i==0:
return False
return True
while True:
num = int(sys.stdin.readline())
for i in range(3,num+1):
if sosu(i):
if sosu(num-i):
print("{} = {} + {}".format(num,i,num-i))
break
if num == 0:
break
문제에 a와 b는 3부터 시작하는 홀수라고 정해져있기 때문에 i의 범위를 3부터 시작해야함
이렇게 하고 보니 생각보다 간단한 문제였다.
소수를 구할 땐 루트 값 까지만 돌려도 된다는 것을 잊지말것 !
원래 num(int(input())을 자주 애용했는데, 이번에 얘 때매 시간초과에 걸렸다.
앞으로 input 대신 sys.stdin.readline을 쓰려고 노력해봐야겠다.
'백준 문제풀이 > 수학' 카테고리의 다른 글
[백준] 2004 조합 0의 개수 - python (0) | 2022.11.16 |
---|---|
[백준] 1676 팩토리얼 0의 개수 - python (0) | 2022.11.16 |
[백준] 11576 Base Conversion - python (0) | 2022.11.15 |
[백준] 10872 팩토리얼 - python (0) | 2022.11.15 |
[백준] 11653 소인수분해 - python (0) | 2022.11.15 |