

여기서 동전이 이런 동전은 아니겠죠? 호호

from collections import deque
import sys
input = sys.stdin.readline
N, K = map(int, input().split()) # 동전 단위 수, 목표 금액
coins = [] # 사용 가능한 동전 단위
for _ in range(N):
coins.append(int(input()))
def bfs(K, coins):
# K원을 만들 때 필요한 동전의 최소 개수
# 아직 방문하지 않은 경우 None
answer = [None] * (K + 1)
answer[0] = 0
# 현재 금액, 동전 수
queue = deque([0])
while queue:
# 현재 금액: now
now = queue.popleft()
# 현재 금액에 각 동전의 금액 추가
for c in coins:
after = now + c
# 목표 금액 K원을 안 넘겼는지 확인
# 아직 확인하지 않은 금액인지 확인
if after <= K and answer[after] is None:
queue.append(after)
# 현재 금액에 동전을 한 개 추가했으니...
answer[after] = answer[now] + 1
# 목표 금액을 찾은 경우
if after == K:
return answer[after]
# 목표 금액을 찾지 못한 경우
return -1
print(bfs(K, coins))
BFS 준비
deque 자료구조인 queue를 만들어줍니다.0을 넣어줍니다.answer는 리스트로 각 금액에 도달하는 데 필요한 최소 동전 수를 저장합니다.answer[i]는 금액 i를 만들기 위해 필요한 최소 동전 수를 뜻합니다.answer[0]는, 0원을 만들 땐 동전이 필요없으니 0으로 초기화합니다.None으로 초기화해 아직 방문하지 않았음을 표시합니다.BFS 수행
now)에 대해, 각 동전 금액(c)을 더한 결과(after)를 계산합니다.after)이 목표금액인 K원보다 작거나 같고, 아직 방문하지 않은 경우 (if answer[after] is None)에만 큐에 추가합니다.after은 현재 금액보다 동전을 1개 더 사용해 만들 수 있으므로, answer[after] = answer[now] + 1로 저장합니다.K에 도달한 경우, answer[after]를 반환하면 정답입니다.queue가 빌 때까지 목표 금액을 만들지 못한 경우-1을 반환합니다.K원일 때, 최대 1원부터 K원까지 모든 경우를 탐색하므로,