문제
https://www.acmicpc.net/problem/9020
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
나의 풀이
max=10000
prime_list=[False,False]+[True]*(max-1)
for j in range(2,max+1):
if prime_list[j]:
for k in range(2*j,max+1,j):
prime_list[k]=False
for i in range(int(input())):
num=int(input())
for j in range(num//2,1,-1):
if prime_list[j] and prime_list[num-j]:
print(str(j)+' '+str(num-j))
break
에라토스테네스의 체를 이용하여 n번째 리스트가 참이면 n은 소수라는 의미의 리스트를 만들고 그것을 이용해서 num을 2로 나눠 num의 가운데 값부터 1씩 감소하며 j와 num-j가 모두 소수인 지점을 찾았다.
다른 사람의 풀이
sieve = list(range(10000))
sieve[1] = 0
for i in range(2,101):
for j in range(2*i, 10000, i):
sieve[j] = 0
prime = list(filter(lambda x:x, sieve))
for T in range(int(input())):
n = int(input())
res = 0
for p in prime:
q = n-p
if p>q:
break
if sieve[q]:
res = p
print(res, n-res)
나와 비슷하게 에라토스테네스의 체를 이용하여 풀이를 하였지만
prime 리스트를 만드는 과정에서 사용된 filter와 lambda가 궁금하였다.
filter함수는 이름과 비슷한 기능을 지녔다.
filter(함수,리스트) 로 사용하며 리스트에 들어있는 원소들을 함수에 적용시켜서 결과가 참인 값들로 새로운 리스트를 만들어주는 함수이다.
lambda 형식은 lambda 매개변수: 표현식 의 형식으로 사용하며 (lambda x,y:x+y)(1,2) => 3 이런식으로 사용가능하다.
이번 풀이에서는 원래 값이 숫자인 값은 True로 인식되어 prime 리스트에 들어가게 되고 소수가 아니어 0이 되어버린 값은 False로 처리되어 prime 리스트에 들어가지 못하는 방식으로 풀이하였다
'알고리즘 공부' 카테고리의 다른 글
백준 11650번, lambda와 key를 이용해 특정 기준으로 배열 정렬하기 (0) | 2023.01.10 |
---|---|
백준 2108, Counter, list comprehension (0) | 2023.01.08 |
시간복잡도 구하기 (0) | 2022.12.31 |
백준 4948, 소수 구하기 (에라토스테네스의 체) (0) | 2022.12.31 |
백준 2775번, 리스트의 값 복사 (0) | 2022.12.28 |
댓글