Algorithm/Programmers

43105. 정수 삼각형

사랑우주인 2025. 3. 31. 21:19

문제

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

제한사항

풀이

class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int n = triangle.length;
        int[][] df = new int[n][n];
        
        for(int row = 0 ; row < n ; row ++) {
            int rowLen = row+1;
            for(int col = 0 ; col < rowLen ; col ++) {
                if(row == 0 && col==0) {
                    df[row][col] = triangle[row][col];
                    continue;
                }
                if(col == 0 ) {    
                    df[row][col] = df[row-1][col] + triangle[row][col];
                } else if (col == rowLen-1) {
                    df[row][col] = df[row-1][col-1] + triangle[row][col];
                    
                } else {
                    df[row][col] = Math.max(
                    df[row-1][col-1] + triangle[row][col],
                    df[row-1][col] + triangle[row][col]
                    );
                }
            }
            
            for(int i = 0 ; i < n ; i++) {
                answer = Math.max(df[n-1][i], answer);
            }
        }
        return answer;
    }
}

회고

비교적 쉬운 문제였다. 각 단계에서 최대의 이익을 위해 선택을 해야하는 문제였다. 그리디 알고리즘과 다이나믹 프로그래밍이 떠올랐다.

이진 트리 탐색을 하면서 리프 노드까지 합을 계산한다. 2가지 경우의 수를 고려했다. 양 끝에 노드가 있는 경우와 아닌 경우.

양 끝에 있으면 현재 노드와 직전 노드까지의 최대 총합을 더한 값이 현재 노드까지의 최대 총합일 것이다.

if(col == 0 ) {    
	// 왼쪽 끝
	df[row][col] = df[row-1][col] + triangle[row][col];
	} else if (col == rowLen-1) {
    //오른쪽 끝
    df[row][col] = df[row-1][col-1] + triangle[row][col];
    }

그 외 경우에는 각 노드에서 2가지 경우로 나뉜다. 현재 노드 직전까지 최대 총합은 2가지 경우가 있기 때문이다. 그래서 직전 경우의 수를 비교해서 큰 값과 현재 노드의 값을 합하면 그 값이 현재 노드까지의 최대 총합일 것이다.

else {
                    df[row][col] = Math.max(
                    df[row-1][col-1] + triangle[row][col],
                    df[row-1][col] + triangle[row][col]
                    );