Algorithm

[백준] 2156 포도주 시식 -JAVA

의중 2025. 1. 27. 09:58

백준 2156 포도주 시식 Silver I - JAVA 📌

https://www.acmicpc.net/problem/2156

문제 설명

문제 풀이


접근 💡

문제에서 주어진 조건 중 와인 3잔을 연속해서 마실 수 없다는 조건을 잘 생각해보자.

현재 위치에서 OOX, OXO, XOO의 경우를 생각해 볼 수 있는데, 이 경우 중에 어떤 경우가 제일 많이 먹을 수 있는 경우인지 판단해야 한다.

 

표로 그려 예시를 확인해보자. 현재 선택하고 있는 와인은 3번째 와인이라고 가정한다.

 

dp 배열을 만들어보자.

dp[1] = wine[1], dp[2] = wine[1] + wine[2]로 초기화 해준다.

 

 1. OOX 의 경우

와인순서 (i) 1 2 3 4 5 6
선택여부 O O X      

 

이 경우에는 dp[i - 1]이 된다.

 

2. OXO의 경우

와인순서 (i) 1 2 3 4 5 6
선택여부 O X O      

 

이 경우에는 dp[i - 2] + wine[i]가 된다.

 

3. XOO의 경우

와인순서 (i) 1 2 3 4 5 6
선택여부 X O O      

 

이 경우에는 dp[i - 3] + wine[i - 1] + wine[i]가 된다.

 

위 세가지 경우 중 최댓값을 dp[i]에 저장한다.

-> dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + wine[i], dp[i - 3] + wine[i - 1] + wine[i])

 

이 때 N이 1과 2가 들어오는 경우는 예외처리를 해주어야 한다.

N이 1일 경우 최대는 wine[1]이 된다.

N이 2일 경우 최대는 wine[1] + wine[2]가 된다.

코드 💡

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[] wine = new int[N + 1];
        for (int i = 1; i < N + 1; i++) {
            wine[i] = Integer.parseInt(br.readLine());
        }

        if (N == 1) {
            System.out.println(wine[1]);
            return;
        } else if (N == 2) {
            System.out.println(wine[1] + wine[2]);
            return;
        }

        int[] dp = new int[N + 1];
        dp[1] = wine[1];
        dp[2] = wine[1] + wine[2];

        for (int i = 3; i < N + 1; i++) {
            dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + wine[i], dp[i - 3] + wine[i - 1] + wine[i]));
        }
        System.out.println(dp[N]);

    }
}