Don't give up!

[백준] 2156번 : 포도주 시식 (java) 본문

Coding Test/BOJ

[백준] 2156번 : 포도주 시식 (java)

Heang Lee 2021. 8. 25. 23:19

2156번: 포도주 시식 (acmicpc.net)

 

2156번: 포도주 시식

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

www.acmicpc.net

어떻게 생각하고 문제를 풀었는가?

연속해서 3잔을 마실 수 없는 조건 하에서 최대한 마실 수 있는 양을 계산하기 위해 다음의 케이스를 생각하였습니다.

  1. 이번에 마시지 않음
  2. 이전 잔을 마시지 않았고 이번에 마심
  3. 이전 잔을 마셨고 이번에도 마심

이번 잔을 마시지 않는 케이스에서는 이전 잔에서 마신 것이 문제가 되지 않으므로 이전 잔의 3가지 케이스의 결과를 비교하여 최대값을 선택하고, 2 ~ 3번째 케이스에 대해서는 이전 잔을 마셨다는 전제가 있으므로 이전 잔의 케이스 1 또는 케이스 2의 결과를 선택한다면 빠르게 답을 찾을 수 있을 것이라고 생각하였습니다.

코드

import java.io.*;

class Main {
    private static int[] glasses;
    private static int n;

    public static void main(String[] args) throws IOException {
        readInput();
        int result = drink();
        System.out.println(result);
    }

    private static void readInput() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(reader.readLine());
        glasses = new int[n];
        for(int i=0; i<n; i++){
            glasses[i] = Integer.parseInt(reader.readLine());
        }
        reader.close();
    }

    private static int drink(){
        int[][] total = new int[n][3];
        total[0][1] = glasses[0];
        for(int i=1; i<n; i++){
            total[i][0] = max(total[i-1][0], total[i-1][1], total[i-1][2]);
            total[i][1] = total[i-1][0] + glasses[i];
            total[i][2] = total[i-1][1] + glasses[i];
        }
        return max(total[n-1][0], total[n-1][1], total[n-1][2]);
    }

    private static int max(int a, int b, int c){
        int result = Math.max(a, b);
        result = Math.max(result, c);
        return result;
    }
}

n개의 포도주 잔과 3가지 케이스를 2차원 배열로 정의하였습니다.

i번째 포도주 잔에 대해 3가지 케이스들의 결과를 각 배열에 저장하고, 마지막 잔에 대해서 각 케이스 값들의 최대 값을 반환하여 최대로 마실 수 있는 포도주 양의 크기를 찾아낼 수 있습니다.

0번째 포도주의 경우 이전에 마신 포도주가 존재하지 않으므로 1번째 케이스만을 계산한다면 문제를 해결할 수 있습니다.