ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 정수 삼각형
    Algorithm/DP 2022. 1. 2. 19:10
    728x90

    https://programmers.co.kr/learn/courses/30/lessons/43105

     

    코딩테스트 연습 - 정수 삼각형

    [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30

    programmers.co.kr

     

    - 시간복잡도는 n = 삼각형의 높이라 할 때, n * (n-1) * (n-2) .. * 1 이므로 O(N^2)이다.

     

    - 간단한 DP문제이다. DP문제는 반드시 점화식을 세워야 한다.

     

    i를 꼭짓점부터의 해당 층의 상대적인 위치, j를 그 층에서의 요소의 인덱스라 할 때, 점화식은

     

    dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] (i, j = 0,1,...n)

     

    단, 예외로 해당 층의 가장 첫 번째 요소인 경우와 가장 마지막 요소인 경우를 계산해야 한다.

     

    해당 층의 가장 첫 번째 요소인 경우, dp[i][j] = dp[i-1][j] + triangle[i][j]

     

    해당 층의 가장 마지막 요소인 경우, dp[i][j] = dp[i-1][j-1] + triangle[i][j]이 점화식이 된다.

     

    - 모든 dp값을 구했다면, 정수 값 중에 음수는 없으므로 가장 마지막 층에 답이 존재할 것이므로, 마지막 층의 dp값을 순회하면서 최대값을 구하여 answer에 담아 return 해 주면 된다.

     

    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int solution(vector<vector<int>> triangle) {
        long long answer = 0;
        int height = triangle.size();
        long long dp[500][500];
        dp[0][0] = triangle[0][0];
        for(int i = 1; i < height; i++){
            for(int j = 0; j < triangle[i].size(); j++){
                if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][j];
                else if(j==triangle[i].size()-1) dp[i][j] = dp[i-1][j-1] + triangle[i][j];
                else dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
            }
        }
        answer = dp[height-1][0];
        for(int i = 1; i < triangle[height-1].size(); i++) {
            if(answer < dp[height-1][i]) answer = dp[height-1][i];
        }
        return answer;
    }

    'Algorithm > DP' 카테고리의 다른 글

    백준 2096 내려가기  (0) 2022.09.16
    백준 2839 설탕 배달  (0) 2021.11.13

    댓글

Designed by Tistory.