|
| 1 | +class Solution: |
| 2 | + def coinChange(self, coins: list[int], amount: int) -> int: |
| 3 | + dp = [float('inf')] * (amount + 1) |
| 4 | + dp[0] = 0 |
| 5 | + |
| 6 | + for coin in coins: |
| 7 | + for x in range(coin, amount + 1): |
| 8 | + dp[x] = min(dp[x], dp[x - coin] + 1) |
| 9 | + |
| 10 | + return dp[amount] if dp[amount] != float('inf') else -1 |
| 11 | + |
| 12 | +""" |
| 13 | +================================================================================ |
| 14 | +νμ΄ κ³Όμ |
| 15 | +================================================================================ |
| 16 | +
|
| 17 | +[1μ°¨ μλ] μμ νμμΌλ‘ μ κ·Όνλ©΄? |
| 18 | +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| 19 | +1. λͺ¨λ λμ μ‘°ν©μ μλν΄λ³΄λ©΄ μ΄λ¨κΉ? |
| 20 | +2. coins = [1, 2, 5], amount = 11 |
| 21 | + - 5 + 5 + 1 = 11 (3κ°) |
| 22 | + - 5 + 2 + 2 + 2 = 11 (4κ°) |
| 23 | + - 1 + 1 + ... (11κ°) |
| 24 | + ... λ무 λ§μ κ²½μ°μ μ! |
| 25 | +
|
| 26 | +3. λ¬Έμ : μκ°λ³΅μ‘λκ° λ무 λμ (μ§μ μκ°) |
| 27 | +4. λ ν¨μ¨μ μΈ λ°©λ²μ΄ νμν¨ β DPλ‘ μ κ·Όνμ! |
| 28 | +
|
| 29 | +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| 30 | +[2μ°¨ μλ] DP μ΄κΈ°νμ μ νμ |
| 31 | +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| 32 | +5. dp[i] = iμμ λ§λλλ° νμν μ΅μ λμ κ°μ |
| 33 | +6. μ΄κΈ°ν: |
| 34 | + - dp[0] = 0 (0μ λ§λ€κΈ° = λμ 0κ°) |
| 35 | + - dp[1~amount] = μμ§ κ³μ° μ λ¨ |
| 36 | +
|
| 37 | + dp = [float('inf')] * (amount + 1) |
| 38 | + dp[0] = 0 |
| 39 | +
|
| 40 | +7. μ νμ: |
| 41 | + - κ° λμ coinμ λν΄ |
| 42 | + - dp[x] = min(dp[x], dp[x - coin] + 1) |
| 43 | + - μλ―Έ: "xμ = (x-coin)μ + coin 1κ°" |
| 44 | +
|
| 45 | +8. Eample) coins = [1, 2, 5], amount = 11 |
| 46 | +
|
| 47 | + μ΄κΈ°: dp = [0, inf, inf, inf, ..., inf] |
| 48 | +
|
| 49 | + λμ 1 μ²λ¦¬: |
| 50 | + dp[1] = min(inf, dp[0]+1) = 1 |
| 51 | + dp[2] = min(inf, dp[1]+1) = 2 |
| 52 | + dp[3] = min(inf, dp[2]+1) = 3 |
| 53 | + ... |
| 54 | +
|
| 55 | + λμ 2 μ²λ¦¬: |
| 56 | + dp[2] = min(2, dp[0]+1) = 1 # 2μ λμ 1κ°! |
| 57 | + dp[3] = min(3, dp[1]+1) = 2 # 2+1 |
| 58 | + dp[4] = min(4, dp[2]+1) = 2 # 2+2 |
| 59 | + ... |
| 60 | +
|
| 61 | + λμ 5 μ²λ¦¬: |
| 62 | + dp[5] = min(5, dp[0]+1) = 1 # 5μ λμ 1κ°! |
| 63 | + dp[6] = min(6, dp[1]+1) = 2 # 5+1 |
| 64 | + dp[10] = min(10, dp[5]+1) = 2 # 5+5 |
| 65 | + dp[11] = min(11, dp[6]+1) = 3 # 5+5+1 |
| 66 | +
|
| 67 | +
|
| 68 | +[μ΅μ’
ꡬν] Bottom-Up DP |
| 69 | +ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
| 70 | +12. λͺ¨λ λμ μ λν΄ λ°λ³΅ |
| 71 | +13. κ° λμ μΌλ‘ λ§λ€ μ μλ λͺ¨λ κΈμ‘ μ
λ°μ΄νΈ |
| 72 | +14. λΆκ°λ₯νλ©΄ -1 λ°ν (dp[amount]κ° μ¬μ ν 무νλ) |
| 73 | +
|
| 74 | + for coin in coins: |
| 75 | + for x in range(coin, amount + 1): |
| 76 | + dp[x] = min(dp[x], dp[x - coin] + 1) |
| 77 | +
|
| 78 | + return dp[amount] if dp[amount] != float('inf') else -1 |
| 79 | +
|
| 80 | +15. μκ°λ³΅μ‘λ: O(amount Γ coins) - ν¨μ¨μ ! |
| 81 | +16. 곡κ°λ³΅μ‘λ: O(amount) - dp λ°°μ΄ |
| 82 | +""" |
0 commit comments