-
[Baekjoon Online Judge] 2156번: 포도주 시식문제 풀이/Baekjoon Online Judge 2021. 2. 2. 21:38
요구사항
- 테이블 위에 다양한 포도주가 들어 있는 포도주 잔이 일렬로 놓여 있었다. 포도주 시식을 위해서는 두 가지 규칙이 있다.
1. 포도주 잔을 선택하면 그 잔을 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
2. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.
- 각 포도주 잔에 들어 있는 포도주의 양이 주어졌을 때, 가장 많은 포도주를 마실 수 있도록 작성한다.
입력
- 첫째 줄에 포도주 잔의 개수 n이 주어진다. (1≤n≤10,000) 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다. 포도주의 양은 1,000 이하의 음이 아닌 정수이다.
출력
- 첫째 줄에 최대로 마실 수 있는 포도주의 양을 출력한다.
처음 문제를 딱 접했을 때, 계단 오르기와 유사한 문제라고 생각하였고, 비슷한 방식으로 해결하려 했다.
2021/01/30 - [문제 풀이/다이나믹 프로그래밍] - [Baekjoon Online Judge] 2579번: 계단 오르기
하지만 한가지 간과한 사실이 있었다. 포도주 문제의 경우 잔을 마실 때마다 그 당시 상황에 가장 큰 포도주 양을 dp 테이블에 저장해야 했다. 즉 마시지 않고 그냥 지나치는 경우를 고려하여 작성해야 했다. 몇 번의 시행착오 끝에 마시지 않은 경우 이전 dp 테이블의 값을 유지하는 방식으로 3개의 값을 비교하여 가장 큰 값을 뽑아오는 메소드를 생성하여 해결하였다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Baekjoon2156 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(bufferedReader.readLine()); int[] wines = new int[n + 1]; int[] dp = new int[n + 1]; for( int i = 1; i <= n; ++i ) wines[i] = Integer.parseInt(bufferedReader.readLine()); if (n == 1) { dp[1] = wines[1]; } else if (n == 2) { dp[1] = wines[1]; dp[2] = wines[1] + wines[2]; } else if (n >= 3) { dp[1] = wines[1]; dp[2] = wines[1] + wines[2]; dp[3] = max(dp[2], wines[1] + wines[3], wines[2] + wines[3]); for (int i = 4; i <= n; i++) { // 마시지 않는 경우를 포함 dp[i] = max(dp[i - 1], dp[i - 2] + wines[i], dp[i - 3] + wines[i - 1] + wines[i]); } } bufferedWriter.write(String.valueOf(dp[n])); bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } static int max(int a, int b, int c) { if(a >= b) { if(a >= c) return a; else return c; } else { if(b >= c) return b; else return c; } } }
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 10988번: 팰린드롬인지 확인하기 (0) 2021.02.05 [Baekjoon Online Judge] 2193번: 이친수 (0) 2021.02.02 [Baekjoon Online Judge] 2748번: 피보나치 수 2 (0) 2021.02.01 [Baekjoon Online Judge] 1932번: 정수 삼각형 (0) 2021.02.01 [Baekjoon Online Judge] 2579번: 계단 오르기 (0) 2021.01.30