|
| 1 | +/* |
| 2 | +1. λ¬Έμ μ΄ν΄ |
| 3 | +μ«μλ€μ μ‘°ν©ν΄μ νκ² λλ²λ₯Ό λ§μ‘±νλ κ°μ₯ μμ μ½μΈμ κ°μλ₯Ό λ°ν |
| 4 | +λ§μ‘±νλ μ‘°ν©μ΄ μλ€λ©΄ -1 λ°ν |
| 5 | +
|
| 6 | +λ°°μ΄ μ λ ¬ ν μμ μ«μλΆν° μμν΄μ λνλ©° νκ²λλ²μ μΌμΉνλμ§ μ²΄ν¬ |
| 7 | +μΌμΉνλ€λ©΄ κ·Έλμ μ½μΈ κ°μλ₯Ό κΈ°μ‘΄ κ°μμ λΉκ΅ λ° μ΄κΈ°ν |
| 8 | +λ§μ½ ν¬λ€λ©΄ return νμ¬ λ€μ μ«μλ‘ μ΄λ |
| 9 | +
|
| 10 | +2. μμΈ μν© |
| 11 | +
|
| 12 | +outputμ΄ 12κ° λλ κ²½μ°μ 0μ΄ λλ κ²½μ°λ κ°κ° λ¬΄μ¨ κ²½μ°μΌκΉ ? |
| 13 | +
|
| 14 | +12κ° λλ κ²½μ°λ μ΄λ€ μ‘°ν©μΌλ‘λ νκ²λλ²λ₯Ό λ§λ€μ§ λͺ»νμ κ²½μ° |
| 15 | +
|
| 16 | +0μ΄ λλ κ²½μ°λ amountκ° 0μΌ κ²½μ° μ무 μ«μλ λ°νλλ©΄ μλ κ²½μ°μ΄λ―λ‘ κ°μ₯ μ²μ μ΄κΈ°ν λκ³ λ°λ‘ 리ν΄λ¨. |
| 17 | +
|
| 18 | +3. μκ³ λ¦¬μ¦ |
| 19 | +dfs |
| 20 | +
|
| 21 | +4. ꡬν |
| 22 | +μλ μ½λ |
| 23 | +dfs(μ¬μ©ν μ½μΈ κ°μ, μ§κΈκΉμ§μ κ°) |
| 24 | +νμ¬ κ° == νκ² κ° μ²΄ν¬ |
| 25 | +λ§λ€λ©΄ μ΅μκ° μ΄κΈ°ν |
| 26 | +λ°ν |
| 27 | +
|
| 28 | +for coins |
| 29 | +μ§κΈκΉμ§μ κ° + μλ‘μ΄ μ½μΈ <= νκ² κ° |
| 30 | +λ§λ€λ©΄ dfs(μ¬μ©ν μ½μΈ κ°μ + 1, μ§κΈκΉμ§μ κ° + μλ‘μ΄ μ½μΈ) |
| 31 | +
|
| 32 | +dp |
| 33 | +
|
| 34 | +μ¬κ·λ‘ νμμΌλ Time limitμ΄ κ±Έλ¦¬μ§ μκΈ° μν΄ dpλ‘λ ν μ μλ μ μ κ³ λ €ν μ μλ€. |
| 35 | +
|
| 36 | +dp μ νμμ λ§λ€μ΄ 보μ |
| 37 | +n μμ λ§λ€κΈ° μν λμ μ μ΅μ κ°μμ΄λ―λ‘ |
| 38 | +nμ΄ λ§λ€κ³ μΆμ κΈμ‘, coinμ΄ νμ¬ μ νν λμ μ΄λΌκ³ ν λ |
| 39 | +dp[n] = min(dp[n], dp[n-coin] + 1) μ΄ λμ¨λ€. |
| 40 | +n-coin μ΄ λμ€κ²λ μ΄μ λ nμ λ§λ€κΈ° μν΄ νΉμ μ«μμμ coin λνμ¬ n μ λ§λ€μ΄μΌ νκΈ° λλ¬Έμ΄λ€. |
| 41 | +x + coin = n -> x = n - coin μμ΄ λ§λ€μ΄ μ§λ€. |
| 42 | +ν΄λΉ n-coin μ λ§λ€κΈ° μν μ΅μκ°μμ coinμ λνμΌλ―λ‘ 1μ λν΄μ€μΌλ‘μ¨ |
| 43 | +μ νν coin μμ n μ λ§λ€κΈ° μν μ΅μ κ°μλ₯Ό μ»μ μ μκΈ° λλ¬Έμ΄λ€. |
| 44 | +
|
| 45 | +*/ |
| 46 | + |
| 47 | +import java.util.*; |
| 48 | + |
| 49 | +class Solution { |
| 50 | + private int min; |
| 51 | + public int coinChange(int[] coins, int amount) { |
| 52 | + // int maxLength = 12; |
| 53 | + // min = maxLength + 1; |
| 54 | + // dfs(0, 0, amount, coins); |
| 55 | + // if (min == 13) { |
| 56 | + // return -1; |
| 57 | + // } |
| 58 | + |
| 59 | + int[] dp = new int[amount + 1]; |
| 60 | + |
| 61 | + |
| 62 | + for (int i=1; i<dp.length; i++) { |
| 63 | + dp[i] = amount + 1; // μ΅λκ°λ³΄λ€ 1μ λνμ¬ λ¬΄ν¨ν κ°(μ΅λκ°λ³΄λ€ ν΄ μ μμ)μ μμλ‘ λ£μ΄μ€λ€. |
| 64 | + } |
| 65 | + dp[0] = 0; |
| 66 | + // coin λ€μ μννλ©° κ° μ½μΈλ€μ 루νλ§λ€ ν΄λΉ λμ μΌλ‘ μ΅μ νλ₯Ό νλ€. κ·Έλμ 3λ²μ§Έ λμ μ λλμλ μ΄μ 1, 2λ²μ§Έμ λμ λ€μ λν΄ λμ λ κ²°κ³Όλ₯Ό μ»κ² λλ€. |
| 67 | + for (int c : coins) { |
| 68 | + // c λΆν° μμνλ μ΄μ λ κ°μ§κ³ μλ μ½μΈλ³΄λ€ μ μ n μ λ§λ€ μ μκΈ° λλ¬Έ |
| 69 | + for (int n = c; n < amount + 1; n++) { |
| 70 | + dp[n] = Math.min(dp[n], dp[n-c] + 1); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + if (dp[amount] == amount + 1) { |
| 75 | + return -1; |
| 76 | + } |
| 77 | + |
| 78 | + return dp[amount]; |
| 79 | + } |
| 80 | + |
| 81 | + |
| 82 | + // μκ° μ΄κ³Ό λ°μ |
| 83 | + // public void dfs(int count, long total, int amount, int[] coins) { |
| 84 | + // if (total == amount) { |
| 85 | + // min = Math.min(min, count); |
| 86 | + // return; |
| 87 | + // } |
| 88 | + |
| 89 | + // for (int coin: coins) { |
| 90 | + // if (total + coin <= amount) { |
| 91 | + // dfs(count + 1, total + coin, amount, coins); |
| 92 | + // } |
| 93 | + // } |
| 94 | + // } |
| 95 | +} |
| 96 | + |
0 commit comments