코딩테스트/다이나믹 프로그래밍(Dynamic Programming))

[Java] 백준 1932번 : 정수 삼각형

sujin7837 2022. 3. 23. 22:01
반응형

문제

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

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

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

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

입력

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

예제 입력 1

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

예제 출력 1

30

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	private static BufferedReader bf;
	private static StringTokenizer st;
	
	private static int N, result=0;
	private static int [][]arr, dp;
	
	public static void main(String[] args) throws NumberFormatException, IOException {

		bf=new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(bf.readLine());
		arr=new int[N][N];
		dp=new int[N][N];
		
		for(int r=0;r<N;r++) {
			st=new StringTokenizer(bf.readLine());
			for(int c=0;c<=r;c++) {
				arr[r][c]=Integer.parseInt(st.nextToken());
			}
		}
		
		dp[0][0]=arr[0][0];
		for(int r=1;r<N;r++) {
			for(int c=0;c<=r;c++) {
				if(c==0) dp[r][c]=dp[r-1][c]+arr[r][c];
				else if(c==r) dp[r][c]=dp[r-1][c-1]+arr[r][c];
				else dp[r][c]=Math.max(dp[r-1][c-1], dp[r-1][c])+arr[r][c];
			}
		}
		
		for(int i=0;i<N;i++) {
			result=Math.max(result, dp[N-1][i]);
		}
		System.out.println(result);
	}

}

꼭대기에서부터 맨 아래층까지 가능한 합의 값을 dp에 저장하였습니다.

반응형