프로그래밍 공방

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

개발/문제해결

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

hyosupsong 2021. 1. 1. 15:18

문제

www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

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

www.acmicpc.net

문제해결방법

이 문제는 DP 배열에 왼쪽부터 N번까지 마시며 최대로 마실 수 있는 값을 기록해가면서 풀었다.

N번 포도주를 마실때 계산해줘야 하는 경우는 아래와 같다.

1. N번 포도주를 안 마시는 경우 -> DP[i-1]

2. N번 포도주를 마시는 경우
    - DP[N-2] + N번 포도주의 양 (N-1번을 건너뛰고 마시는 경우)
    - DP[N-3] + N-1번 포도주의 양 + N번 포도주의 양 (N-2번을 건너뛰고 마시는 경우)

마지막으로 DP[N] 의 값이 최대로 마실 수 있는 양이 된다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package baekjoon;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main2156_포도주시식 {
    public static int[] wine, DP;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        wine = new int[N+3];
        DP = new int[N+3];
        for(int i=3; i<N+3; i++) {
            wine[i] = Integer.parseInt(br.readLine());
            DP[i] = DP[i-1];
            DP[i] = Math.max(DP[i], Math.max(DP[i-2], DP[i-3]+wine[i-1])+wine[i]);
        }
        System.out.println(DP[N+2]);
    }
}
cs


코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.