백준|2156번|포도주 시식

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
47/51

문제설명
수열을 입력받고 그 수열의 수들을 규칙에 따라 합해서 만들 수 있는 최대의 수를 구하는 문제입니다. 규칙은 수열에서 세자리를 연속해서는 합할수 없다는 것입니다.

작동 순서
1. 수열의 길이를 입력받습니다.
2. 수열을 입력받습니다.
3. 수열을 합해갈 때 경우는 세가지가 있는데 현재 것을 가져가지 않는 경우(연속 0), 이전것은 가져가지않고 현재것을 가져가는 경우(연속 1), 이전것도 가져가고 현재것도 가져가는 경우(연속 2)입니다.
4. 현재 것을 가져가지 않는 경우 이전의 연산에서 가장 큰수를 가져오면됩니다.
5. 현재 것을 가져가고 이전 것을 가져가지 않는 경우 바로 이전 연산에서 연속 0의 값이나 i-2번째의 연산에서 가장 큰 값을 가져와서 현재의 수를 더해주면됩니다.
6. 마지막으로 현재 것과 이전 것 모두 가져가는 경우 이전 것에서 연속 1의 값을 가져와서 현재의 수를 더해주면 됩니다.
7. 모든 연산이 완료되면 마지막 단계에서 연속 0 연속 1 연속 2의 3가지 경우에서 가장 큰 수를 출력합니다.

소스코드

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

public class 백준_2156번_포도주시식 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int max = 0;
        int[] wine = new int[n];
        int[][] dp = new int[n][3];
        for(int i=0;i<n;i++) wine[i]=Integer.parseInt(br.readLine());
        if(n>0) {
            dp[0][0] = 0;
            dp[0][1] = wine[0];
            dp[0][2] = wine[0];
        }
        if(n>1) {
            dp[1][0] = 0;
            dp[1][1] = wine[1];
            dp[1][2] = wine[0] + wine[1];
        }

        for(int i=2;i<n;i++){
            dp[i][0]=Math.max(dp[i-1][0], Math.max(dp[i-1][1], dp[i-1][2]));
            dp[i][1]=Math.max(dp[i-1][0], dp[i-2][2])+wine[i];
            dp[i][2]=dp[i-1][1]+wine[i];
        }
        max=Math.max(max, Math.max(dp[n-1][0], Math.max(dp[n-1][1], dp[n-1][2])));
        System.out.print(max);
    }
}
profile
학사지만 AI하고 싶어요...

0개의 댓글