
coins 배열 안에 있는 값들로 amount를 만들어야 하는데 가장 적은 개수를 사용해 만드는 문제
만약 만들지 못하면 -1 반환
가장 적은 개수를 사용해야 하기 때문에 0부터 시작해서 차례대로 방문하면서 가장 처음 목표 금액에 도달했을 때가 가장 적은 개수를 이용하는 것
‘최소’의 동전으로 목표 금액을 만들어라 → BFS
BFS는 그래프나 트리에서 가장 가까운 노드부터 차례대로 탐색하는 알고리즘
시작 노드에서 가까운 노드부터 차례대로 탐색하며, 큐를 사용해 구현
BFS는 최단 경로 탐색에 유리한데, 모든 간선의 가중치가 동일할 때 먼저 방문한 경로가 항상 가장 짧기 때문
따라서 가장 먼저 도착한 경로가 곧 최단 경로
class Solution {
public int coinChange(int[] coins, int amount) {
//amount가 0일 때 0 반환
if (amount == 0) {
return 0;
}
//큐와 방문 노드 선언
Queue<int[]> queue = new LinkedList<>();
boolean[] visited = new boolean[amount + 1];
//큐에 넣고 방문 처리
queue.add(new int[] {amount, 0});
visited[amount] = true;
//BFS 수행
//큐가 빌 때까지
while (!queue.isEmpty()) {
//큐에서 현재 노드 꺼내기
int[] currentNode = queue.poll();
//현재 금액
int currentAmount = currentNode[0];
//사용한 동전 개수
int coinCount = currentNode[1];
//다음 노드들에 대해 설정
for (int coin : coins) {
int next = currentAmount - coin;
//만약 다음 노드가 0이라면 목표 금액에 달성
//개수 반환
if (next == 0) {
return coinCount + 1;
}
//다음 노드가 0이 아니고 방문하지 않았을 때
if (next > 0 && !visited[next]) {
//방문 처리
visited[next] = true;
//큐에 다음 노드와 사용 동전 개수 넣어주기
queue.add(new int[] {next, coinCount + 1});
}
}
}
return -1;
}
}