백준 9020번, filter와 lambda

    문제

    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 리스트에 들어가지 못하는 방식으로 풀이하였다

    댓글