💡Problem Solving/BOJ

[BOJ 1932] 정수 삼각형 (Java)

gom20 2021. 11. 8. 11:15

문제

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

정수 삼각형

풀이

7
7
       
3
10
8
15
     
8
18
1
16
0
15
   
2
20
7
25
4
20
4
19
 
4
24
5
30
2
27
6
26
5
24

2차 배열에 최대값을 저장하면서 더해나간다. 

첫번째 값 dp[i][j] = num + dp[i-1][j];

마지막 값 dp[i][j] = num + dp[i-1][j-1];

나머지 값 dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]);

 

마지막 행의 최대값을 구한다. 

N이 1일 경우 for문 내에서 최대값이 저장되지 않으므로, 따로 예외처리를 해주었다. 

소스코드

package dp;

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

public class BOJ1932 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int answer = 0;
        int N = Integer.parseInt(br.readLine());
        int[][] dp = new int[N+1][N+1];
        StringTokenizer st = null;
        for(int i = 1; i <= N; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 1; j <= i; j++){
                dp[i][j] = Integer.parseInt(st.nextToken());
                if(i == 1 && j == 1) continue;
                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]);
                }
                if(i == N){
                    answer = Math.max(dp[i][j], answer);
                }
            }
        }
        if(N == 1){
            System.out.println(dp[1][1]);
        } else {
            System.out.println(answer);
        }
    }
}