322. Coin Change

늘보·2021λ…„ 10μ›” 12일
0

LeetCode

λͺ©λ‘ 보기
36/69

πŸ’‘ 풀이

// DP
var coinChange = function (coins, amount) {
  let dp = Array(amount + 1).fill(Infinity);
  dp[0] = 0;

  for (let i = 1; i < dp.length; i++) {
    for (let coin of coins) {
      if (i - coin >= 0) dp[i] = Math.min(dp[i], dp[i - coin] + 1);
    }
  }

  console.log(dp[dp.length - 1]);

  return dp[dp.length - 1] === Infinity ? -1 : dp[dp.length - 1];
};

// μ•„λž˜λŠ” κ·œμΉ™μ„ μ°ΎκΈ° μœ„ν•΄ λͺ‡ 가지 적어둔 것이닀.


// F(11) -> F(9) / F(8) / F(6)
// -> λ§Œμ•½ 문제 μ˜ˆμ‹œμ²˜λŸΌ 11을 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€λ©΄

// 9λ₯Ό λ§Œλ“œλŠ” 경우의 수, 8을 λ§Œλ“œλŠ” 경우의 수, 6을 λ§Œλ“œλŠ” 경우의 수(즉, 3가지 경우의 수 μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 값을 κ΅¬ν•˜λ©΄ λœλ‹€.)의 μ΅œμ†Œκ°’μ„ κ΅¬ν•˜κ³ , 거기에 '1을 λ”ν•˜λ©΄' cost 배열을 μ΄μš©ν•΄ 11을 λ§Œλ“œλŠ” 경우의 μˆ˜κ°€ λœλ‹€.

// λ”°λΌμ„œ 이λ₯Ό μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄
// F(11) = Math.min(F(9), F(8), F(6)) + 1

// μ’€ 더 μžμ„Ένžˆ ν‘œν˜„ν•˜λ©΄
//F(n) = Math.min(F(n - cost[i]), F(n - cost[i + 1]), F(n - cost[i + 2])) + 1

// -> μœ„μ˜ μ½”λ“œλŠ” μ§€κΈˆκΉŒμ§€ μž‘μ„±ν–ˆλ˜ 식을 μ½”λ“œλ‘œ ν‘œν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€.

let coins = [1, 2, 5];
let amount = 11;

coinChange(coins, amount);

πŸ“ 정리

λ§ˆμ°¬κ°€μ§€λ‘œ DPλ₯Ό ν™œμš©ν•œ λ¬Έμ œμ˜€λ‹€. μ›Œλ‚™ 유λͺ…ν•œ 문제라 보자마자 Greedy둜 ν’€μ–΄μ•Ό ν•˜λŠ” 쀄 μ•Œκ³  DPλ₯Ό μƒκ°ν•˜μ§€ λͺ»ν–ˆμ—ˆλŠ”데, κ·œμΉ™μ„ μ°Ύκ³  λ‚˜λ‹ˆ DP둜 ν•΄κ²°ν•˜λŠ” λ¬Έμ œλΌλŠ” 것을 μ•Œκ²Œ 됐닀. 상세 풀이 μ„€λͺ…은 μœ„μ˜ μ£Όμ„μœΌλ‘œ λŒ€μ²΄ν•˜κ² λ‹€.

μˆ˜μ •, 지적을 ν™˜μ˜ν•©λ‹ˆλ‹€!

문제 링크

https://leetcode.com/problems/coin-change/

LeetCode GitHub

https://github.com/tTab1204/LeetCode

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보