프로그래밍/백준

[알고리즘] 백준 19699 파이썬 - 소-난다!

매 석 2023. 3. 25. 22:31
반응형

 

 

19699번: 소-난다!

지난 번 헛간 청약의 당첨우(牛)가 발표됐다. 청약에 당첨된 소들은 날아갈 듯이 기뻐하다가 진짜로 하늘을 날았다. 하지만 이후로 소들은 날 수 없었다. 그러던 어느 날, 꿀벌에게 쏘이면 잠깐

www.acmicpc.net

문제

지난 번 헛간 청약의 당첨우(牛)가 발표됐다. 청약에 당첨된 소들은 날아갈 듯이 기뻐하다가 진짜로 하늘을 날았다. 하지만 이후로 소들은 날 수 없었다. 그러던 어느 날, 꿀벌에게 쏘이면 잠깐 하늘을 날 수 있다는 사실을 깨달았다. 이 사실이 퍼지자 소들은 다시 자유롭게 하늘을 날기 시작했다.

소들이 하늘을 날며 우(牛)통사고가 빈번해지자, 농부 존은 소들이 하늘을 나는 것에 제한을 두었다. 소들은 항의했지만 소들의 항의는 받아들여지지 않았다.

농장에는 마리의 소가 있다. 농부 존은 소들의 몸무게의 합이 소수(prime)가 되도록 마리의 소를 선별할 계획이다. 농부 존의 계획에 맞게 소를 선별했을 때 나올 수 있는 몸무게의 합을 모두 출력하시오.

문제풀이

#01
def dfs(start,depth,sum):
    if depth==m:
        if sum in prime:
            ans.add(sum)
    for i in range(start,n):
        if not visited[i]:
            visited[i]=True
            dfs(i+1,depth+1,sum+x[i])
            visited[i]=False
#02
n=9000
prime=[]
tmp=[False,False]+([True]*(n-1))
for i in range(2,n):
    if tmp[i]:
        prime.append(i)
    for j in range(2*i,n-1,i):
        tmp[j]=False
n,m=map(int,input().split())
x=list(map(int,input().split()))
#03
visited=[False]*n
ans=set()
dfs(0,0,0)
if ans:
    print(*sorted(list(ans)))
else:
    print(-1)

- #01 : dfs를 통해서 입력받은 x의 리스트에서 m개를 뽑은 값이

           prime안에 있는 값 즉 소수라면 ans에 추가해준다.

- #02 : n은 9000으로 설치하고, 에라토스테네스의 체를 이용하여서

           2부터 9000까지의 소수를 prime에 저장한다.

- #03 : ans에 중복을 제외한 sum값을 dfs를 통해서 저장하고,

           if문을 통해 오름차순으로 출력한다. 만약 ans에 비어있다면 -1을 출력한다.