접근방법

  1. DP는 어려웡
  2. 현재 포도주에 대한 3가지 행동을 할 수 있다.
    1. 이전에 쉬고 마시기 ( 그 이전까지 최대 값을 가져옴 )
    2. 이전에 마시기 ( 이건 이전에 먹으면 그 이전에 한번 쉬고 온것 까지 계산해야됨)
    3. 안 마시기 ( 이전의 최대값 그대로 가져옴 )

입 / 출력

입력 3
1
1
0
3
1
0
1
3
0
1
1
1
1
2
1
2
4
5
5
5
5
5
0
0
10
0
0
출력 2 2 2 1 3 15 10

 

코드

더보기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 포도주_시식 {

    public static void main(String[] arg) throws IOException {
        // BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        int amountOfWine[] = new int[n];

        for (int i = 0; i < n; i++) {
            amountOfWine[i] = Integer.parseInt(reader.readLine());
        }
        if (n == 1) {
            // 와인이 1잔일 때는 그 1잔만 마신다.
            System.out.println(amountOfWine[0]);
            return;
        } else if (n == 2) {
            // 와인이 2잔일 때는 두 잔 모두 마시는 것이 최대
            System.out.println(amountOfWine[0] + amountOfWine[1]);
            return;
        }

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

'개인 공부 > 백준' 카테고리의 다른 글

11652번 카드 ( JAVA )  (1) 2024.09.09
11401번 이항 계수 3  (1) 2024.09.08
2580번 스도쿠 ( JAVA )  (1) 2024.09.03
14888번 연산자 끼워넣기 ( JAVA )  (1) 2024.09.02
2346번 풍선 터뜨리기 ( JAVA )  (0) 2024.09.01

+ Recent posts