알고리즘/BAEKJOON

[백준] 2156 포도주 시식 (Java)

kyeee2 2022. 3. 30. 11:15

[2156 포도주 시식]

난이도: 실버1

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

문제

입력

출력


[아이디어]

0, 1, 2번 연속해서 마시는 경우를 생각하여 2차원 배열을 잡아준다.

D[i][j] = i번째 포도주가 0번째 연속해서 마시는 경우라고 생각하자.


D[i][0]: i번째 음료를 마시지 않는 경우            -> i-1번째에서 가장 큰 값 가져오기
D[i][1]: i번째 음료를 1번째 연속으로 마신 경우 -> i-2번째애서 가장 큰 값 + 현재 포도주 값
D[i][2]: i번째 음료를 2번째 연속으로 마신 경우 -> i-1번째에서 1번 연속으로 마신 값 + 현재 포도잔 값

 

초기값으로 1번째 음료와 2번째 음료를 설정해준다.

정답으로는 N번째 음료가 0, 1, 2번째 연속해서 마신 경우들 중 최댓값이 된다.


[JAVA 코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
	static int N;
	static int [] nums;
	static int [][] D;

	public static void main(String[] args) throws NumberFormatException, IOException {
		N = Integer.parseInt(br.readLine());
		nums = new int [N + 1];
		D = new int [N + 1][3];
		for(int i = 1; i <= N; i++) {
			nums[i] = Integer.parseInt(br.readLine());
		}
		
		if(N == 1) {
			System.out.println(nums[1]);
			return;
		}
        
  	        // 초기값 설정
		D[1][0] = 0;
		D[1][1] = nums[1];
		D[1][2] = 0;
		D[2][0] = nums[1];
		D[2][1] = nums[2];
		D[2][2] = nums[1] + nums[2];
        
		for(int i = 3; i <= N; i++) {
			D[i][0] += Math.max(D[i - 1][0], Math.max(D[i - 1][1], D[i - 1][2]));
			D[i][1] += Math.max(D[i - 2][0], Math.max(D[i - 2][1], D[i - 2][2])) + nums[i];
			D[i][2] += D[i - 1][1] + nums[i];
		}
		
		System.out.println(Math.max(D[N][0], Math.max(D[N][1], D[N][2])));
	}

}