PS/PS Log

23.08.11. 풀었던 문제들 복기

hyelie 2023. 8. 11. 19:48

Leetcode 518. Coin Change II, 25분

 백준 2293. 동전 1과 동일한 문제.

 일단 2차원 dp로 푼다고 하면, dp[i][j] : coin i까지 봤을 때 j원을 표기할 수 있는 개수로 두자.

  • i번째 coin을 안쓰는 경우 - dp[i][j] = dp[i-1][j]
  • i번째 coin을 쓰는 경우   - dp[i][j] = dp[i][j-coin[i-1]]

위와 같이 되므로 이 점화식을 그대로 적용하기만 하면 된다.

 

 space complexity를 조금 개선할 수 있는데, dp[i][j] = dp[i-1][j]는 항상 고정이므로 dp를 1차원 배열로 만들수도 있다.

// time O(nm), space O(nm)
// Runtime 43 ms Beats 39.13%
// Memory 18.4 MB Beats 58.93%

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<vector<int>> dp(coins.size(), vector<int>(amount+1, 0));
        for(int i = 0; i<coins.size(); i++){
            dp[i][0] = 1;
            for(int j = 1; j<=amount; j++){
                if(i-1 >= 0) dp[i][j] = dp[i-1][j];
                if(j - coins[i] >= 0) dp[i][j] += dp[i][j-coins[i]];
            }
        }

        

        return dp[coins.size()-1][amount];
    }
};

// time O(nm) space O(m)
// Runtime 13 ms Beats 76.84%
// Memory 7.1 MB Beats 90.15%
class Solution {
public:
    int change(int amount, vector<int>& coins) {


        vector<int> dp(amount+1, 0);
        dp[0] = 1;
        for(int i = 0; i<coins.size(); i++){
            for(int j = 1; j<=amount; j++){
                if(j - coins[i] >= 0) dp[j] += dp[j-coins[i]];
            }
        }

        return dp[amount];
    }
};