본문 바로가기

ALGORITHM

백준 2096 내려가기 (Java)

1. 문제 링크

 

2096번: 내려가기

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

최솟값과 최댓값을 저장하는 배열을 따로 만들었고 처음 입력받은 줄을 배열에 저장한 상태에서 시작한다.

계속해서 입력받으면서 비교 범위에 있는 값들 중 큰 값과 입력받은 값을 더해 저장한다.

전부 입력 받은 후에 저장된 값들 중 최솟값과 최댓값을 찾는다.

 

주의할 점은 비교할 때 이후에 입력받은 값들 중 크거나 작은 값이 아니라,

이미 저장된 값들 중 크거나 작은 값을 찾아 더하는 방식으로 진행해야 한다.

비교하는 값을 어디로 잡느냐에 따라서 문제를 맞고 틀리고가 정해진다.

 

4. 코드

import java.io.BufferedReader;
import java.io.IOException;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
		int min = Integer.MAX_VALUE;
		int max = Integer.MIN_VALUE;
		int N = Integer.parseInt(br.readLine());
		int[] line = new int[3];
		int[] maxA = new int[3];
		int[] minA = new int[3];
		int[] now = new int[3];
		
		String[] split = new String[3];
		for(int i=0;i<N;i++) {
			split = br.readLine().split(" ");
			for(int j=0;j<3;j++) {
				line[j] = Integer.parseInt(split[j]); 
			}
			
			if(i==0) {
				maxA[0] = line[0];
				maxA[1] = line[1];
				maxA[2] = line[2];
				
				minA[0] = line[0];
				minA[1] = line[1];
				minA[2] = line[2];
			}
			else { 
				now[0] = line[0] + Math.max(maxA[0], maxA[1]);
				now[1] = line[1] + Math.max(maxA[0], Math.max(maxA[1], maxA[2]));
				now[2] = line[2] + Math.max(maxA[1], maxA[2]);
				maxA[0] = now[0];
				maxA[1] = now[1];
				maxA[2] = now[2];
				
				now[0] = line[0] + Math.min(minA[0], minA[1]);
				now[1] = line[1] + Math.min(minA[0], Math.min(minA[1], minA[2]));
				now[2] = line[2] + Math.min(minA[1], minA[2]);

				minA[0] = now[0];
				minA[1] = now[1];
				minA[2] = now[2];
			}
		}
		
		max = Math.max(maxA[0], Math.max(maxA[1], maxA[2]));
		min = Math.min(minA[0], Math.min(minA[1], minA[2]));
		System.out.println(max+" "+min);		
	}	
}