본문 바로가기
개발/알고리즘

[백준 2096] 내려가기- Java

by DevByun 2021. 6. 15.

문제 링크 : https://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

풀이

다이나믹 프로그래밍으로 구현하였다.

map[r][c] : (r, c)의 값

max[r][c] : (r, c)를 선택했을 때 max값

min[r][c] : (r, c)를 선택했을 때 min값

 

ex) max[r][1] = max(max[r-1][0], max[r-1][1], max[r-2][1]) + map[r][1]

 

 

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

public class 내려가기 {
	static int N;
	static int[][] map;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		map = new int[N][3];

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			map[i] = new int[] { Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
					Integer.parseInt(st.nextToken()) };
		}

		int[][] max = new int[N][3];
		int[][] min = new int[N][3];
		
		for(int i = 0; i < 3; i++) {
			max[0][i] = map[0][i];
			min[0][i] = map[0][i];
		}
		for(int r = 1; r < N; r++) {
			max[r][0] = Math.max(max[r-1][0], max[r-1][1]) + map[r][0];
			max[r][1] = Math.max(Math.max(max[r-1][0], max[r-1][1]), max[r-1][2]) + map[r][1];
			max[r][2] = Math.max(max[r-1][1], max[r-1][2]) + map[r][2];
			min[r][0] = Math.min(min[r-1][0], min[r-1][1]) + map[r][0];
			min[r][1] = Math.min(Math.min(min[r-1][0], min[r-1][1]), min[r-1][2]) + map[r][1];
			min[r][2] = Math.min(min[r-1][1], min[r-1][2]) + map[r][2];
		}
		
		int resultMin = Math.min(Math.min(min[N-1][0], min[N-1][1]), min[N-1][2]);
		int resultMax = Math.max(Math.max(max[N-1][0], max[N-1][1]), max[N-1][2]);
		System.out.println(resultMax + " " + resultMin);
	}

}

 

'개발 > 알고리즘' 카테고리의 다른 글

Javascript 2차원 배열 선언, 초기화 하기  (0) 2022.10.06
[백준 1525] 퍼즐- Java  (0) 2021.05.17

댓글