[종만북] TRIANGLEPATH 삼각형 위의 최대 경로

문제보기

import java.util.*;
import java.io.*;

public class Main{

  public static void main(String []args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int t = Integer.parseInt(br.readLine());
    while(t-->0){
      int n = Integer.parseInt(br.readLine());
      int[][] map = new int[n][n];

      for(int i = 0 ; i < n ; i++ ){
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int j = 0 ; j <= i ; j++ ){
          map[i][j] = Integer.parseInt(st.nextToken());
        }
      }
			// 기본적으로 위에서부터 최적의 선택을 하면서 내려가는건 아무 의미가 없다
      // 맨 아래 구석에 999999 가 숨어있다면 다 소용없기 때문
      // 따라서 아래에서부터 최적의 선택을 하면서 올라가는게 좋다
      // i, j 까지 올라오는 동안 최대값
      int[][] d = new int[n][n];
			// 일단 맨 아랫단 애들은 시작점이므로 자기 자신이 최댓값이 된다.
      for(int i = 0 ; i < n ; i++ ){
        d[n-1][i] = map[n-1][i];
      }
			
      // 아랫줄부터 시작해서 서서히 올라온다
      for(int i = n-2 ; i >= 0 ; i-- ){
        // 열 번호는 그냥 앞에서부터 해줘도 상관 없다
        for(int j = 0 ; j <= i ; j++ ){
          // 해당 위치까지 올라오는 동안 최적의 결과는
          // 일단 자기 자신 더하고...
          // 바로 밑에 있는 애랑 그 오른쪽에 있는애 중에 큰 애를 선택하면 된다
          d[i][j] = map[i][j] + Math.max(d[i+1][j], d[i+1][j+1]);
        }
      }

      // 맨 위에 있는 애는 모든 숫자를 거쳐 최고의 결과만을 모은것임 
      System.out.println(d[0][0]);

    }
  }
}

Comments