Algorithm/백준

Backjoon(백준) 1932번 - 정수삼각형(Java)

GrapeMilk 2020. 4. 25. 01:23

1. 풀이 과정

 - 각 층의 숫자마다 윗 층부터 조건에 맞게 내려온 숫자들의 최대합을 구하여 저장한뒤 각 합 중에서 최대 값을 판별한다.

 

* 풀이 과정 예시

 1) 각 층의 양 끝 숫자의 합은 윗 층 부터 대각선으로 한 방향으로 내려온 숫자들의 합이 최대 합이된다.

 2) 각 층의 양 끝값 사이의 수들은 윗 층으로 부터 내려온 숫자중에서 현재 층의 숫자의 앞으로 한칸 뒤로 한칸 값의 합이 된다.

 3) 또한 양 끝값 사이의 수가 둘 이상일 경우 다음 층으로 내려가기 전에 각 숫자들의 합중에 최대 값을 구한 뒤 다음 층을 계산한다.

 4) 위와 같이 각 층의 숫자들의 최대합을 구하면서 마지막 층으로 내려가면 최종적으로 왼쪽 끝값, 오른쪽 끝값, 가운데 값이 남게 된다.

 5) 마지막으로 남은 세 값의 최대값이 정답이다.

 

2. 코드 구현

 - 삼각형에 들어갈 값을 입력한 그 자리에 바로 계산한 최대합을 저장한다.

 - 각 삼각형의 위치에 바로 최대합을 저장해서, 계산할 때 입력받은 삼각형의 값이 아닌 최대합끼리 계산할 수 있도록 코드를 구현한다.

 - 최대합의 저장은 현재 삼각형에 있는 수 + 이전 위치에서 최대값.

 

import java.util.Scanner;

public class IntegerTriangle {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int max = 0, n = sc.nextInt();
        int[][] dp = new int[501][501];
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i][j] = sc.nextInt(); // 각 층에 숫자 입력
                
                // 숫자 입력과 동시에 최대값 판별 
                if (j == 1) {
                    dp[i][j] += dp[i - 1][j]; //양 끝값은 그대로 내려온 값이 최대합
                } else if (j == i) {
                    dp[i][j] += dp[i - 1][j - 1];
                } else {
                    dp[i][j] += Math.max(dp[i - 1][j - 1], dp[i - 1][j]); // 중간에 있는 수 최대합 판별
                }
                // 최대값 저장
                max = Math.max(max, dp[i][j]);
            }
        }
        System.out.println(max);
        
        sc.close();

    }

}

 

* Buffer로 입력받아서 구현해보기