백준 온라인 저지/Gold

[BOJ] 2096 - 내려가기

jooona 2021. 2. 24. 00:29
반응형

-개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.

 

문제

www.acmicpc.net/problem/2096

 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

난이도: 골드 4

사용언어: JAVA

 

풀이

이 문제는 [1149번 - RGB거리]와 굉장히 유사한 문제입니다. 기본적인 풀이는 아래의 RGB거리에 대한 풀이에서 확인하실 수 있습니다.

 

jooona.tistory.com/64

 

[BOJ] 1149 - RGB거리

-개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다. 문제 설명 www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강

jooona.tistory.com

RGB거리와 다른 점이라면, 바로 다음 레벨로 이동할 수 있는 칸의 위치와 최댓값과 최솟값을 모두 구해야 한다는 점뿐입니다. 최댓값과 최솟값을 모두 구하기 위해 두 개의 이차원 배열을 사용해 다이나믹 프로그래밍을 수행하였습니다.

 

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
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
 
class Main {
 
    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 N = Integer.parseInt(br.readLine());
        int i, j;
        int [][]max = new int[N][3]; // 최댓값을 구하기 위한 dp 배열
        int [][]min = new int[N][3]; // 최솟값을 구하기 위한 dp 배열
        int []arr = new int[3]; // 매 줄 마다 입력 값을 저장하기 위한 배열
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(j=0;j<3;j++){
            max[0][j] = Integer.parseInt(st.nextToken()); // max 배열과 min 배열 모두 첫 줄은 입력 그대로 사용
            min[0][j] = max[0][j];
        }
        
        for(i=1;i<N;i++){
            st = new StringTokenizer(br.readLine());
            for(j=0;j<3;j++){
                arr[j] = Integer.parseInt(st.nextToken());
            }
            max[i][0= Math.max(max[i-1][0],max[i-1][1]) + arr[0]; // 가장 왼쪽 칸에는 윗 행의 가장 왼쪽 칸과 가운데 칸에서만 값을 받아올 수 있음
            max[i][1= Math.max(max[i-1][0],Math.max(max[i-1][1],max[i-1][2]))+ arr[1]; // 가운데 칸에는 윗 행의 모든 칸에서 값을 받아올 수 있음
            max[i][2= Math.max(max[i-1][1],max[i-1][2])+ arr[2]; // 가장 오른쪽 칸에는 윗 행의 가장 오른쪽 칸과 가운데 칸에서만 값을 받아올 수 있음
            min[i][0= Math.min(min[i-1][0],min[i-1][1])+ arr[0];
            min[i][1= Math.min(min[i-1][0],Math.min(min[i-1][1],min[i-1][2]))+ arr[1];
            min[i][2= Math.min(min[i-1][1],min[i-1][2])+ arr[2];
        }
 
        Arrays.sort(max[N-1]); // max 배열의 가장 아래 행 소팅
        Arrays.sort(min[N-1]); // min 배열의 가장 아래 행 소팅
        bw.write(String.valueOf(max[N-1][2])+ " "); // max 배열의 가장 아래 행에서 최댓값 출력
        bw.write(String.valueOf(min[N-1][0])+"\n"); // min 배열의 가장 아래 행에서 최솟값 출력
        bw.flush();
    }
}
cs

 

반응형

'백준 온라인 저지 > Gold' 카테고리의 다른 글

[BOJ] 3055 - 탈출  (0) 2021.02.27
[BOJ] 16172 - 나는 친구가 적다 (Large)  (2) 2021.02.25
[BOJ] 1987 - 알파벳  (0) 2021.02.23
[BOJ] 13549 - 숨바꼭질 3  (0) 2021.02.23
[BOJ] 2206 - 벽 부수고 이동하기  (0) 2021.02.22