코딩테스트 준비 💻/Baekjoon

[백준] 자바 Java, 1932번: 동적계획법 > 정수 삼각형

ImYena 2021. 9. 10. 01:40
728x90

 

 

1932번: 정수 삼각형

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

www.acmicpc.net


문제

        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번째 줄까지 정수 삼각형이 주어진다.

 

 

출력

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

 

 

알고리즘 분류

  • 다이나믹 프로그래밍

 

나의 풀이

  • Top-down 방식 사용

dp[][] 테이블

package level15_dynamicProgramming;

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

// 백준 1932번 문제] 정수 삼각형
public class Baekjoon1932 {
    static int n; // 크기 n의 삼각형형
    static int[][] arr;
    static Integer[][] dp;

    public static void main(String[] args) throws IOException {
        // 입력 start
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        n = Integer.parseInt(br.readLine());

        arr = new int[n][n];
        dp = new Integer[n][n];

        for(int i=0; i<n; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<i+1; j++) { // 행의 인덱스의 +1만큼의 요소 입력
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        // 입력 end

        // 가장 마지막 행의 값들을 DP에 저장
        for (int i=0; i<n; i++) {
            dp[n-1][i] = arr[n-1][i];
        }

        System.out.println(dp(0, 0));
   } //main end

    public static int dp(int r, int c) { // 행, 열
        if(r == (n - 1)) return dp[r][c]; // 저장 되어 있는 마지막행 dp 값들은 바로 반환

        if(dp[r][c] == null) {
            dp[r][c] = arr[r][c] +  Math.max(dp(r+1, c), dp(r+1,c+1));
        }

        return dp[r][c];
    }
}

 

결과

 

728x90
반응형