Algorithm/μΈν”„λŸ°(inflearn)

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] section10 - 4 - 동전 κ΅ν™˜(냅색 μ•Œκ³ λ¦¬μ¦˜)

YWTechIT 2021. 10. 14. 10:05
728x90

πŸ“ section10 - 4 - 동전 κ΅ν™˜(냅색 μ•Œκ³ λ¦¬μ¦˜)

문제: λ‹€μŒκ³Ό 같이 μ—¬λŸ¬ λ‹¨μœ„μ˜ 동전듀이 μ£Όμ–΄μ Έ μžˆμ„ λ•Œ κ±°μŠ€λ¦„λˆμ„ κ°€μž₯ 적은 수의 λ™μ „μœΌλ‘œ κ΅ν™˜ν•΄μ£Όλ €λ©΄ μ–΄λ–»κ²Œ μ£Όλ©΄ λ˜λŠ”κ°€? 각 λ‹¨μœ„μ˜ 동전은 λ¬΄ν•œμ • μ“Έ 수 μžˆλ‹€.

 

// μž…λ ₯
3
1 2 5
15

// 좜λ ₯
// (5, 5, 5) 동전 3개둜 거슬러 쀄 수 μžˆλ‹€.
3

 

λ™μ „κ΅ν™˜ λ¬Έμ œλŠ” μ €λ²ˆμ— dfs(뢀뢄집합) + edgeCut을 μ΄μš©ν•΄μ„œ ν‘Ό 적이 μžˆλ‹€. λ§Œμ•½μ— λ™μ „μ˜ μ’…λ₯˜κ°€ 100개 이상, κ±°μŠ€λ¦„ 돈이 100,000 이상일 경우 DFS둜 ν’€ 수 μ—†λ‹€. 이럴 λ•ŒλŠ” DPμ—μ„œ 냅색 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν’€μ–΄μ•Ό ν•œλ‹€.

 

  1. dpλŠ” κ±°μŠ¬λŸ¬μ€„ 돈(m)만큼 λ°°μ—΄μ˜ 크기λ₯Ό μ„ μ–Έν•˜κ³  μ΅œμ†Œ λ™μ „μ˜ 개수λ₯Ό ꡬ해야 ν•˜λ―€λ‘œ 개수λ₯Ό 제일 많이 κ±°μŠ¬λŸ¬μ£ΌλŠ” κ°œμˆ˜λ³΄λ‹€ 큰 κ°’μœΌλ‘œ μ„€μ •ν•œλ‹€.(λ¬Έμ œμ—μ„œ κΈˆμ•‘μ€ μ΅œλŒ€ 500μ›κΉŒμ§€μΈλ°, λ‹€λ₯Έ 동전에 λΉ„ν•΄ 1μ›μœΌλ‘œ 500원을 κ±°μŠ¬λŸ¬μ£ΌλŠ” κ°œμˆ˜κ°€ 제일 λ§ŽμœΌλ―€λ‘œ 1μ›μ§œλ¦¬ 동전 500κ°œκ°€ ν•„μš”ν•˜λ―€λ‘œ dpλŠ” 500보닀 큰 κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” μ‹œν‚¨λ‹€. )
  2. dp[j]: j κΈˆμ•‘μ„ 거슬러 쀄 λ•Œ μ‚¬μš©λ˜λŠ” μ΅œμ†Œ λ™μ „μ˜ 개수
  3. 핡심 둜직: ν˜„μž¬ κ±°μŠ¬λŸ¬μ€˜μ•Ό ν•  λ™μ „μ˜ κΈˆμ•‘λ§ŒνΌ λΉΌμ£Όκ³  이전에 거슬러 쀬던 λ™μ „μ˜ μ΅œμ†Œ 개수 + 1 (ν˜„μž¬ λ‚΄κ°€ κ±°μŠ¬λŸ¬μ£ΌλŠ” λ™μ „μ˜ 개수)
  4. 0원을 κ±°μŠ¬λŸ¬μ£ΌλŠ” λ™μ „μ˜ 개수 dp[0]=0
  5. n원은 dp[n]λΆ€ν„° μ‹œμž‘ν•œλ‹€.

 

 

728x90

 

let n = 3;
let coin = [1, 2, 5];
let change = 15;

console.log(solution(n, coin, change));

function solution(n, coin, change){
  let dp = Array.from({length: change+1}, () => 1000);
  dp[0]=0;  // 0원을 거슬러 μ£ΌλŠ” 경우의 수 0

  for (let i=0; i<n; i++){
    for (let j=coin[i]; j<=change; j++){
      dp[j]=Math.min(dp[j], dp[j-coin[i]]+1);
    }
  }
  return dp[change];
}

πŸ‘‰πŸ½ 3

 

λ°˜μ‘ν˜•