[PY] 2294 : 동전 2

https://www.acmicpc.net/problem/2294

처음부터 끝까지 내가 했다면 정말 좋았겠지만, 아쉽게도 아이디어가 아예 안떠올랐기에 파일럿 의 도움을 받았다.
이정도..

 

  • 큐(queue)에 시작 상태(금액 0, 동전 수 0)를 삽입합니다.
  • 현재 상태에서 가능한 모든 동전 값을 더하여 다음 상태를 큐에 추가합니다.
  • 방문 여부를 체크하여 중복 계산을 방지합니다.
  • 목표 금액에 도달하면 탐색을 종료하고 해당 경로의 동전 수를 반환합니다.

BFS로 일리 있는 구간의 탐색을 진행 할 수 있다는 것에 또 한번 놀란다.
이걸 BFS라고 부르는 이유는 queue를 사용하기 때문 딱 하나일 것이다.

메모리 초과 이슈로 인해 visited 부분도 도움을 좀 받았다. 그러고 나니 말끔하게 해결

 

from collections import deque
import sys
input = sys.stdin.readline

coinList = []
queue = deque()
minCoinCnt = float('inf')



coinCnt, req = map(int, input().split())
visited = [float('inf')] * (req + 1)  # 최소 동전 수를 추적
visited[0] = 0  # 초기 상태

coinList.sort()

for i in range(coinCnt):
    inputVal = int(input())
    coinList.append(inputVal)
# means : coin total value | total coin count.
queue.append([0, 0])
def BFS():
    global minCoinCnt
    while queue:
        coinTotalVal, coinTotalCnt = queue.popleft()

        if(coinTotalVal == req):
            minCoinCnt = min(coinTotalCnt, minCoinCnt)
            continue
        elif (coinTotalVal > req):
            continue
        else:
            for coin in coinList:
                nextVal = coinTotalVal + coin
                if nextVal <= req and coinTotalCnt + 1 < visited[nextVal]:
                    visited[nextVal] = coinTotalCnt + 1
                    queue.append([nextVal, coinTotalCnt + 1])
BFS()
if (minCoinCnt != float('inf')):
    print(minCoinCnt)
else:
    print('-1')

'문제풀이' 카테고리의 다른 글

[PY] 3055 : 탈출  (0) 2025.04.02
[PY] <!> 1432 : 그래프 수정  (0) 2025.04.02
[PY] 18352 : 특정 거리의 도시 찾기  (0) 2025.04.01
[PY] 14888 : 연산자 끼워넣기  (0) 2025.04.01
[PY] <!> 1707 : 이분 그래프  (0) 2025.04.01