|
| 1 | +# coins: λμ μ κ°κ²©μ΄ μ ν μ μ λ°°μ΄, κ° μ«μλ μ λν¬ν¨, μ λ ¬μ λν μΈκΈ X, (1 <= coins.length <= 12) |
| 2 | +# amount: λμ μ΄ν© |
| 3 | + |
| 4 | +# amountλ₯Ό λ§λ€ μ μλ κ°μ₯ μ μ λμ μ μλ₯Ό λ°ννλ€. |
| 5 | +# coinsλ‘ amountλ₯Ό λ§λ€ μ μλ κ²½μ° -1μ λ°ν |
| 6 | +# λμ μ μ’
λ₯λ 무νλλΌκ³ κ°μ νκ³ λ¬Έμ λ₯Ό ν κ² |
| 7 | + |
| 8 | +# μ²μμλ greedyλ‘ μ κ·Όνλ €κ³ νλλ°, κΈμ‘μ΄ ν° λμ μ λ¨Όμ μ ννλκ² μ΅μ λμ μ μκ° μλλΌμ dpλ‘ νμ΄νλ€. |
| 9 | + |
| 10 | +# [볡μ‘λ] |
| 11 | +# C: μ½μΈμ κ°μ, # A: amount |
| 12 | +# μκ° λ³΅μ‘λ: O(A * C) |
| 13 | +# κ³΅κ° λ³΅μ‘λ: O(A) |
| 14 | +class Solution: |
| 15 | + def coinChange(self, coins: List[int], amount: int) -> int: |
| 16 | + NOT_POSSIBLE = amount + 1 |
| 17 | + |
| 18 | + # min_coins: κΈμ‘μ λ§λλλ° νμν λμ κ°μλ₯Ό μ μ₯νλ λ°°μ΄ |
| 19 | + # min_coins[i]: iμμ λ§λλλ° νμν μ΅μ λμ μ κ°μ |
| 20 | + min_coins = [NOT_POSSIBLE] * (amount + 1) |
| 21 | + min_coins[0] = 0 |
| 22 | + |
| 23 | + for cur_amount in range(1, amount + 1): |
| 24 | + # coin: μ νν λμ |
| 25 | + for coin in coins: |
| 26 | + if cur_amount >= coin: |
| 27 | + # λ μ€ λ μμ κ°μΌλ‘ μ
λ°μ΄νΈ |
| 28 | + # 1. κΈ°μ‘΄μ ꡬν κ°μ |
| 29 | + # 2. νμ¬ λμ μ 1κ° μΆκ°ν΄μ λ§λλ κ°μ |
| 30 | + min_coins[cur_amount] = min(min_coins[cur_amount], min_coins[cur_amount - coin] + 1) |
| 31 | + |
| 32 | + # μ΄κΈ°νλ κ° κ·Έλλ‘μ΄λ©΄ λΆκ°λ₯ν μ‘°ν©μ΄λ―λ‘ -1 λ°ν |
| 33 | + if min_coins[amount] == NOT_POSSIBLE: |
| 34 | + return -1 |
| 35 | + # μ΅μ λμ μ κ°μλ₯Ό λ°ν |
| 36 | + else: |
| 37 | + return min_coins[amount] |
0 commit comments