본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2156 포도주 시식

by 까망 하르방 2021. 2. 22.
반응형

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

 Input 

6

6

10

13

9

8

1

 

 Output 

33

▶ 동적계획법(Dynamic Programming, DP) 

 

동적계획법(Dynamic Programming, DP)

동적 계획법(Dynamic Programming)은 큰 의미에서 분할 정복과 같은 접근 방식을 의미한다. 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로부터 원래 문제에 대한

zoosso.tistory.com

* 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.

    O    O    X

    X    O    O

    O    X    O

wine[i] ; i 번째 포도잔에 들어있는 포도주의 양(비용)

dp[i] = Max(dp[i-1],  wine[i] + wine[i-1] + dp[i-3], wine[i] + dp[i-2])

            i 번째 포도잔까지의 최대로 마신 양(비용)

 

① i 번째 포도주를 먹지 않았을 경우

    → ( i-1번째에서 새로 확인.)

② i 번째 포도주와 i-1번째 포도주를 마신 경우

    → (i와 i-1번째 값을 포함하고 i-3번째에서 새로 확인)

 i번째 포도주를 마시고 i-1번째를 안 마신 경우

    → (i번째 값을 포함하고 i-2번째에서 새로 확인)


import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
         
        // 인덱스를 1부터하기 위함
        int[] wine = new int[n+1];
        int[] dp = new int[n+1];
         
        // 포도주 양(비용) 입력
        for(int i=1; i<=n; i++) {
            wine[i] = Integer.parseInt(sc.next());
        }
         
        dp[0] = 0;
        dp[1] = wine[1];
         
        if(n > 1) { // 포도잔이 최소 2개
            dp[2] = wine[1] + wine[2];
        }
 
        for(int i=3 ; i<=n ; i++) {
            dp[i] = Max( dp[i-1], wine[i] + wine[i-1] + dp[i-3], wine[i] + dp[i-2]);
        }
         
        System.out.println(dp[n]);
 
    }
 
    private static int Max(int...arr) {
        int result = arr[0];
        for(int i=1; i<arr.length; i++) {
            result = result > arr[i] ? result : arr[i];
        }
        return result;
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 1766 문제집  (0) 2021.02.22
[BOJ] 백준 2234 성곽  (0) 2021.02.22
[BOJ] 백준 9461 파도반 수열  (0) 2021.02.22
[BOJ] 백준 1012 유기농 배추  (0) 2021.02.22
[BOJ] 백준 1759 암호 만들기  (0) 2021.02.22

댓글