hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

23.08.11. 풀었던 문제들 복기

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];
    }
};

 

 

 

 

저작자표시 (새창열림)

'PS > PS Log' 카테고리의 다른 글

23.08.16. 풀었던 문제들 복기  (0) 2023.08.16
23.08.15. 풀었던 문제들 복기  (0) 2023.08.15
23.08.10. 풀었던 문제들 복기  (0) 2023.08.11
23.08.09. 풀었던 문제들 복기  (0) 2023.08.09
23.08.08. 풀었던 문제들 복기  (1) 2023.08.09
    hyelie
    hyelie

    티스토리툴바