백준 1932 정수 삼각형 - JAVA

2025. 1. 31. 18:03·알고리즘/백준

1932 문제 링크


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

 

문제 설명


 

입출력


 

코드


< Top-down 방식 >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.util.*;
 
public class Main {
    static int[][] arr;
    static Integer[][] dp;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int input = Integer.parseInt(br.readLine());
        arr = new int[input][input];
        dp = new Integer[input][input];
        
        StringTokenizer st;
        for(int i = 0; i < input; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j <= i; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());  
            }
        }
        dp[0][0] = arr[0][0];
 
        int max = 0;
        for (int i = 0; i < input; i++) {
            int value = findMax(input - 1,i);
            if(max < value) {
                max = value;
            }
        }
        bw.write(String.valueOf(max));
        bw.flush();
    }
    
    private static int findMax(int row, int col) {
        if (dp[row][col] == null) {
            if (col == 0) {
                dp[row][col] = findMax(row-1, col) + arr[row][col];
            } 
            else if (row == col) {
                dp[row][col] = findMax(row-1, col-1) + arr[row][col];
            } else {
                dp[row][col] = Math.max(findMax(row-1, col-1), findMax(row-1, col)) 
+ arr[row][col];
            }
            
        }
        return dp[row][col];
    }
}
Colored by Color Scripter
cs

 
 

< Bottom-up 방식 >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.io.*;
import java.util.*;
 
public class Main {
    static int[][] arr;
    static int[][] dp;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int input = Integer.parseInt(br.readLine());
        arr = new int[input][input];
        dp = new int[input][input];
        
        StringTokenizer st;
        for(int i = 0; i < input; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j <= i; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());    
            }
        }
        bw.write(String.valueOf(findMax(input)));
        bw.flush();
    }
    
    private static int findMax(int input) {
        dp[0][0] = arr[0][0];
        for (int i = 1; i < input; i++) {
            for (int j = 0; j <= i; j++) {
                if(j == 0) {
                    dp[i][0] = dp[i-1][0] + arr[i][0];
                }
                else if(j == i) {
                    dp[i][i] = dp[i-1][i-1] + arr[i][i];
                    
                } else {
                    dp[i][j] = arr[i][j] + Math.max(dp[i-1][j-1], dp[i-1][j]);
                }
            }  
        }
        int max = Arrays.stream(dp[input - 1]).max().getAsInt();
        return max;
    }
}
Colored by Color Scripter
cs

 

알고리즘 설명


이번 동적 계획법 문제는 탑다운방식과 바텀업 방식 모두 사용해서 해결해봤습니다. 탑다운 방식은 재귀호출스택을 사용하여 문제를 해결하는 방식이고, 바텀업 방식은 반복문을 활용하여 문제를 해결하는 방식입니다.
 
탑다운 방식은 dp[][] 배열을 생성하여, dp[i][j]의 값이 null이라면, 재귀함수 호출을 사용하여 구한값을 arr[i][j]의 값과 누적합하여, dp[][] 배열에 입히는 방식으로 진행하였고, 탑다운 방식은 반복문을 사용하여, 두 번째 열부터 이전 열의 arr[i][j -1]과 arr[i][j]의 값을 비교햐여, 더 큰 값을 새로운 배열 dp[][]에 누적합하는 방식으로 진행하였습니다.
 
- 참고 -
배열에 자료형을 선언할때, int로 선언하면, 지정되지 않은 부분은 0으로 채워지고, Integer로 선언하면 지정되지 않은 부분은 null값이 채워지게 됩니다.

 

Top-Down VS Bottom-Up


탑다운 방식은 메모이제이션을 사용해서 큰 부분부터 작은 부분까지 쪼개어 계산하는 방식이고, 바텀업 방식은 반복문을 사용해서 작은 부분부터 합쳐가며 큰 부분까지 계산하는 방식입니다. 두 개의 방식을 표로 정리해보겠습니다. 분명 메모리나 실행 속도에서 차이가 있을 텐데요, 표로 정리해보았습니다.

Top-Down / Bottom-Up 비교 표

 
Top-Down 코드와 Bottom-Up 코드의 실행 결과도 보여드리겠습니다.

위부터 차례대로 Top-Down, Bottom-Up

실제로 Top-Down방식(재귀 함수 호출)이 2MB정도의 메모리를 더 차지했다는 사실을 알 수 있습니다. 크게 유의미한 차이는 아닌것 같습니다.

 

코드 해석


Bottom-up 코드와 Top-Down코드의 입력은 2차원배열을 사용하여 같고, dp 2차원 배열에 값을 담는 방식만 다릅니다.

위의 내용을 토대로 보시면 코드 해석은 어렵지 않을것이라고 생각합니다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 10844 쉬운 계단 수 - JAVA  (0) 2025.02.02
백준 2579 계단 오르기 - JAVA  (0) 2025.02.01
백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA  (1) 2025.01.30
백준 11399 ATM - JAVA  (0) 2025.01.29
백준 1149 RGB거리 - JAVA  (0) 2025.01.28
'알고리즘/백준' 카테고리의 다른 글
  • 백준 10844 쉬운 계단 수 - JAVA
  • 백준 2579 계단 오르기 - JAVA
  • 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA
  • 백준 11399 ATM - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 알고리즘 (53)
        • 백준 (44)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    백준
    Lv2
    DFS
    BFS
    java
    알고리즘 고득점 kit
    브루트포스
    bottom-up
    동적 계획
    Top-Down
    너비 우선 탐색
    재귀
    기술질문
    깊이 우선 탐색
    dp
    프로그래머스
    자료구조
    CS
    Baekjoon
    완전탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 1932 정수 삼각형 - JAVA
상단으로

티스토리툴바