|
| 1 | +from collections import deque |
| 2 | + |
| 3 | +class Solution: |
| 4 | + def coinChange(self, coins: List[int], amount: int) -> int: |
| 5 | + # BFSλ₯Ό μ΄μ©ν μ΅μ λμ κ°μ μ°ΎκΈ° |
| 6 | + # λμ μ νλμ© μΆκ°νλ©΄μ λ§λ€ μ μλ κΈμ‘μ νμ (λ λ²¨λ³ νμ) |
| 7 | + # BFS νΉμ±μ λ¨Όμ λλ¬νλ κ²½λ‘κ° μ΅μ λμ κ°μ 보μ₯ |
| 8 | + # dp[i]: amountκ° iμΌ λ μ΅μ λμ μ¬μ© νμ |
| 9 | + # λͺ¨λ κ²½μ° λ°©λ²μ΄ μλ€κ³ κ°μ νκ³ -1λ‘ μ΄κΈ°ν |
| 10 | + dp = [-1 for _ in range(amount + 1)] |
| 11 | + |
| 12 | + # bfs μ
μ
- ν©μ΄ 0μΈ λ
Έλλ₯Ό λ°©λ¬Ένκ³ , λ°©λ¬Έ μ²λ¦¬ |
| 13 | + dp[0] = 0 |
| 14 | + # νμ κ° μμ: [μ¬μ©ν λμ κ°μ, νμ¬κΉμ§μ ν©] |
| 15 | + # μμ μν: λμ 0κ°, ν© 0 |
| 16 | + q = deque([[0, 0]]) |
| 17 | + |
| 18 | + while q: |
| 19 | + # current[0]: μ¬μ©ν λμ κ°μ, current[1]: νμ¬κΉμ§μ ν© |
| 20 | + current = q.popleft() |
| 21 | + |
| 22 | + # κ°κ°μ λμ μ 무νν μ¬μ©ν μ μμΌλ―λ‘, κ°λ₯ν κ²½μ° λͺ¨λ νμ |
| 23 | + for coin in coins: |
| 24 | + estimated = current[1] + coin |
| 25 | + |
| 26 | + # estimated <= amount: λͺ©ν κΈμ‘μ μ΄κ³Όνμ§ μλ κ²½μ°λ§ νμ |
| 27 | + # dp[estimated] == -1: μμ§ λ°©λ¬Ένμ§ μμ κΈμ‘ (BFS νΉμ±μ μ΅μ΄ λλ¬μ΄ μ΅μ ) |
| 28 | + # λ 쑰건 λͺ¨λ ν΅κ³Όνλ©΄ νμ μΆκ°νμ¬ κ³μ νμ |
| 29 | + if estimated <= amount and dp[estimated] == -1: |
| 30 | + used = current[0] + 1 |
| 31 | + dp[estimated] = used |
| 32 | + |
| 33 | + new = [used, estimated] |
| 34 | + q.append(new) |
| 35 | + |
| 36 | + # dp[amount]κ° -1μ΄λ©΄ λͺ¨λ κ²½μ° λ°©λ²μ΄ μλ€λ μλ―Έμ΄λ―λ‘ -1 λ°ν |
| 37 | + # κ·Έλ μ§ μλ€λ©΄ dp[amount] λ°ν |
| 38 | + return dp[amount] |
0 commit comments