다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환
해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다.
| 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;
};