동전교환(냅색 알고리즘)

bkboy·2022년 6월 22일
0

문제

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

제한 사항

첫 번째 줄에는 동전의 종류개수 N(1<=N<=12)이 주어진다. 두 번째 줄에는 N개의 동전의 종
류가 주어지고, 그 다음줄에 거슬러 줄 금액 M(1<=M<=500)이 주어진다.
각 동전의 종류는 100원을 넘지 않는다.
첫 번째 줄에 거슬러 줄 동전의 최소개수를 출력한다.

입출력 예

풀이

function solution(m, coin) {
  let answer = 0;
  let dy = Array.from({ length: m + 1 }, () => 1000);
  dy[0] = 0;
  for (let i = 0; i < arr.length; i++) {
    // arr[i] 동전으로 j원을 주려면 얼만큼 줘야하는지
    for (let j = coin[i]; j <= m; j++) {
      // j가 10원이였고 coin[i]가 5라면,
      // 10원을 거슬러주는 돈은 dy[5] 즉 5원을 거슬러주는 갯수에 하나추가이다.
      dy[j] = Math.min(dy[j], dy[j - coin[i]] + 1);
    }
  }
  answer = dy[m];
  return answer;
}

let arr = [1, 2, 5];
console.log(solution(15, arr));

사용하는 동전을 늘려가며 값을 갱신해나간다.
dy에 배열에는 해당 인덱스를 거슬러 줄 돈이라고 생각하고 몇개가 필요한지가 들어가게 된다.

냅색 알고리즘

profile
음악하는 개발자

0개의 댓글