백준 - 9020번 - 골드바흐의 추측
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
틀린 코드1(시간초과)
혹시나 해서 n의 값에 따른 primes를 따로따로 구했더니 시간 초과가 되었다.
def find_primes(n):
primes = []
for num in range(2, n+1):
do = 'yes'
if num <= 3:
primes.append(num)
elif num % 2 != 0:
for i in range(3, int(num**(1/2))+2, 2):
if num % i == 0:
do = 'no'
break
if do == 'yes':
primes.append(num)
return primes
T = int(input())
for i in range(T):
n = int(input())
primes = find_primes(n)
for index in range(int(len(primes)/2), len(primes)):
if n - primes[index] in primes:
print(n-primes[index], primes[index])
break
틀린 코드2
시간 초과를 해결하기 위해 10000이하의 소수를 다 구하여 저장해두었다.
for index in range(int(len(num_prime)/2),len(num_prime)+1): 이 부분에서
num_prime의 크기를 반으로 나누면 n/2 값 보다 작은 소수와 큰 소수로 나누어 질 것이라 생각했다.
하지만 n/2보다 큰 소수와 작은 소수의 개수가 다르기 때문에 틀렸다.
import sys
def find_primes(n):
primes = []
for num in range(2, n+1):
do = 'yes'
if num <= 3:
primes.append(num)
elif num % 2 != 0:
for i in range(3, int(num**(1/2))+2, 2):
if num % i == 0:
do = 'no'
break
if do == 'yes':
primes.append(num)
return primes
primes = find_primes(10000)
T = int(sys.stdin.readline())
for i in range(T):
n = int(sys.stdin.readline())
num_prime = [prime for prime in primes if prime <= n]
for index in range(int(len(num_prime)/2),len(num_prime)+1):
if n - primes[index] in primes:
print(n-primes[index], primes[index])
break
맞은 코드
1. 10000보다 작은 소수들을 모두 구한다.
2. n에 대한 소수의 합들중 차이가 가장 작은 값을 선택해야한다.
3. 중간에 가까운 값일 수록 차이가 가장 적다.
4. n = a + b라면 a > n/2이고 b < n/2 이므로 n/2부터 시작해서 찾는다.
5. 그리하여 n/2이상의 소수들을 high_p으로 두고 이하의 값을 low_p으로 두었다.
import sys
def find_primes(n):
primes = []
for num in range(2, n+1):
do = 'yes'
if num <= 3:
primes.append(num)
elif num % 2 != 0:
for i in range(3, int(num**(1/2))+2, 2):
if num % i == 0:
do = 'no'
break
if do == 'yes':
primes.append(num)
return primes
primes = find_primes(10000)
T = int(sys.stdin.readline())
for i in range(T):
n = int(sys.stdin.readline())
high_p = [prime for prime in primes if (prime >= n/2) & (prime <= n)]
low_p = [prime for prime in primes if prime <= n / 2]
for h in high_p:
if (n - h) in low_p:
print(n-h, h)
break
결과
'코딩 테스트 > 백준' 카테고리의 다른 글
백준 10870번 - 피보나치 수 5 (0) | 2022.08.10 |
---|---|
10872번 - 팩토리얼 (0) | 2022.08.10 |
백준 4948번 - 베르트랑 공준 (0) | 2022.08.10 |
백준 1929번 - 소수 구하기 (0) | 2022.08.09 |
백준 11653번 - 소인수분해 (0) | 2022.08.09 |