Algorithm

[Algorithm] 정수 삼각형

씬프 2021. 6. 22. 13:28
반응형

문제

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층부터 시작해서 아래에 있는 수 중 하나를 선택해 아래층으로 내려올 때,  이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하시오. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중 하나만 선택할 수 있다.

 

풀이

금광 문제와 마찬가지로 최대를 저장하는 2차원배열은 선언한다.

금광은 모든 2차원 배열을 탐색하면서 지나갔지만, 위 문제는 범위에 대한 조절만 잘 하면 된다.

 

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[][] graph = new int[n][n];
        int[][] d = new int[n][n];
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < i; j++) {
                graph[i-1][j] = sc.nextInt();
            }
        }

        d[0][0] = graph[0][0];

        int[] dy = {-1, 0}; // 왼쪽 대각선, 오른쪽 대각선

        for (int i = 2; i <= n; i++) {
            // d[i][j] => d[i][j] , graph[i][j] + d[i-2][j, j-1]
            // 행의 길이는 윗 행보다 1 크다
            for (int j = 0; j < i; j++) {
                for (int k = 0; k < 2; k++) {
                    int ny = j + dy[k];
                    if (0 <= ny && ny < i-1) {
                        d[i-1][j] = Math.max(d[i-1][j], graph[i-1][j] + d[i-2][ny]);
                    }
                }
            }
        }

        int result = 0;
        for (int i = 0; i < n; i++) {
            result = Math.max(result, d[n-1][i]);
        } //마지막 행에 각 루트의 최대값이 저장되어있다.
        System.out.println(result);

    }
        
}

'Algorithm' 카테고리의 다른 글

[Algorithm] 병사 배치하기  (0) 2021.06.24
[Algorithm] 퇴사  (0) 2021.06.23
[Algorithm] 금광  (0) 2021.06.21
[Algorithm] 공유기 설치  (0) 2021.06.20
[Algorithm] 고정점 찾기  (0) 2021.06.19