다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환
해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다.
Input | Input | Output |
---|---|---|
[1,2,5] | 15 | 3 |
coinTypes
의 원소들로 주어진 금액 amount
를 만든다고 했을 때, 가장 적은 수의 원소를 사용하는 경우를 구하는 문제이다.coinTypes
배열을 돌면서 깊이와 sum
에 coninTypes
의 i
번째 원소를 더해 내려보낸다.sum
이 주어진 amount
보다 커진다면 현재 깊이에서의 DFS를 끝낸다.sum
이 주어진 금액 amount
와 같아지면 DFS 의 깊이 depth
가 곧 금액 amount
를 만드는 데에 쓰인 동전의 개수이다.depth
가 이전에 정해진 answer
보다 같거나 크다면 answer
의 최소값을 구하고자 하는 문제의 의도와 다르므로, 현재 깊이에서의 DFS를 끝낸다.const solution = (coninTypes, amount) => {
let answer = Number.MAX_SAFE_INTEGER;
const DFS = (depth, sum) => {
if (sum > amount) return;
if (depth >= answer) return;
if (sum === amount) {
answer = Math.min(sum, depth);
return;
} else {
for (let i = 0; i < coninTypes.length; i++) {
DFS(depth + 1, sum + coninTypes[i]);
}
}
};
DFS(0, 0);
return answer;
};