seungriyou / algorithm-study

알고리즘 & SQL 문제 풀이 기록
https://leetcode.com/u/summer_y
0 stars 0 forks source link

[LC] 322. Coin Change #30

Open seungriyou opened 8 months ago

seungriyou commented 8 months ago

https://leetcode.com/problems/coin-change/ similar to #71

Approach

Idea 1 (2D DP)

0/1 knapsack 문제이다. 따라서 2D DP로 접근할 수 있다.

def coinChange(coins: List[int], amount: int) -> int:
    """2D DP"""

    INF = amount + 1

    n = len(coins)

    # dp[i][j]: i번째 coin까지 확인했을 때, j만큼의 amount를 만들 수 있는 동전의 최소 개수
    dp = [[INF] * (amount + 1) for _ in range(n + 1)]
    dp[0][0] = 0

    for i in range(1, n + 1):               # -- 물건 (coins)
        dp[i][0] = 0
        for j in range(1, amount + 1):      # -- 임시 용량 (amount)
            if j >= coins[i - 1]:
                dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1)
            else:
                dp[i][j] = dp[i - 1][j]

    return dp[n][amount] if dp[n][amount] != INF else -1

하지만 dp[i - 1][j], dp[i][j - coins[i - 1]]만 사용하므로, 1D로 optimize 가능하다.


Idea 2 (1D DP)


Idea 3 (BFS) 😮

0 부터 amount 까지의 최단 거리를 구하는 것처럼 접근하면 BFS도 가능하다. (심지어 time 측면에서 DP보다 두 배 이상 좋다...?!)


Complexity