본문 바로가기
문제풀이

백준 1932번 정수삼각형 JAVA

by AndoneKwon 2020. 11. 18.

DP문제이다. 이전 층에 있던 삼각형의 합을 메모라이제이션 해서 원하는 층에서 그 저장해 놨던 값을 재사용 함으로서 연산의 회수를 줄인다. Bottom up 방식으로 풀었다.

만약 DP를 사용하지 않고 완전탐색으로 푼다면,

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

 

위와 같은 정수 삼각형이 있다고 가정을 하면,
각 층마다 조합으로 한가지를 선택하는 것이기 때문에
1C1 * 2C1 * 3C1 * 4C1 * 5C1로 결론적으로
5!의 시간복잡도가 나타나게 된다.

층수를 입력범위중 최대인 500이면 500!의 시간복잡도가 나타나기 때문에 불가능하다.
따라서, 또 다른 정수 합의 저장을 위한 리스트를 만들고

         7
      10   15
    18   16   15
  20   25   20   19
24   30   27   26   24

 

와 같이 층을 거듭할수록 이전 층에 계산한 값을 재사용(메모라이제이션)을 함으로서 복잡도를 크게 줄인다.

이와같은 방식을 통해서 구하게 된다면 시간복잡도는 O(n^2)이 되게 된다.

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

public class Main {
    static List<List> DP;
    static List<List> triangle;
    public static void go(int layser,int N){
        if(layser==N){
            return;
        }
        for(int i=0;i<triangle.get(layser-1).size();i++){
            for(int j=i;j<i+2;j++){
                DP.get(layser).set(j,Math.max((Integer) triangle.get(layser).get(j)+(Integer)DP.get(layser-1).get(i),(Integer)DP.get(layser).get(j)));
            }
        }
        go(layser+1,N);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int N = Integer.parseInt(br.readLine());
        triangle = new ArrayList<>();
        DP = new ArrayList<>();
        int temp = 0;
        for(int i=0;i<N;i++){
            st=new StringTokenizer(br.readLine());
            triangle.add(new ArrayList<Integer>());
            DP.add(new ArrayList<Integer>());
            while (st.hasMoreTokens()){
                triangle.get(i).add(Integer.parseInt(st.nextToken()));
                DP.get(i).add(-1);
            }
        }
        DP.get(0).set(0,triangle.get(0).get(0));
        go(1,N);
        int answer = -1;
        for(int i=0;i<N;i++){
            answer=Math.max(answer, (Integer) DP.get(N-1).get(i));
        }
        System.out.print(answer);
    }
}

'문제풀이' 카테고리의 다른 글

백준 1005 ACMCraft JAVA  (0) 2020.11.27
백준 4485번 초록색 옷 입은 애가 젤다지?  (0) 2020.11.27
BOJ17471_게리멘더링 JAVA  (0) 2020.11.12
백준 14267번 내리 칭찬 java  (0) 2020.11.12
백준 14502번 연구실 JAVA  (0) 2020.11.09