프로그래머스 - 정수 삼각형

Updated:

Java

정수 삼각형

문제

접근 방법

삼각형의 높이를 n이라고 하면, 맨 아래 줄의 원소 개수도 n개이다.

각 위치까지 내려오면서 만들 수 있는 최대 합을 저장하기 위해 n x n 크기의 2차원 배열을 생성하고 이를 DP 배열로 사용한다.

dp[i][j] 는 i,j 지점까지 내려 왔을 때, 가장 비용이 큰 것을 담는 객체

점화식 도출

삼각형의 구조상, triangle[i][j] 위치로 내려올 수 있는 경우는 두 가지뿐이다.

  • 바로 위에서 내려오는 경우 → dp[i-1][j]
  • 위에서 왼쪽 한 칸에서 내려오는 경우 → dp[i-1][j-1]

따라서, dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]

코드

import java.util.*;

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int n = triangle.length;
        int[][] dp = new int[n][n];
        dp[0][0] = triangle[0][0];

        for(int i = 1; i < n; i++ ) {
            for(int j = 0; j < triangle[i].length; j++) {
                for(int k = -1; k <= 0; k++) {
                    if(j + k < 0)
                        continue;
            
                    if(dp[i][j] < dp[i-1][j + k]  + triangle[i][j]) {
                        dp[i][j] = dp[i-1][j + k]  + triangle[i][j];
                    }
                }
            }
        }

        for(int i = 0; i < n; i++) {
            answer = Math.max(answer, dp[n-1][i]);
        }
        return answer;
    }
}