[백준 JAVA] 2156 : 포도주 시식
2024. 3. 7. 17:15ㆍ백준
[백준 2156] 포도주 시식 : https://www.acmicpc.net/problem/2156
2156번: 포도주 시식
효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규
www.acmicpc.net
문제 조건 정리
- 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
- 연속으로 놓여 있는 3잔을 모두 마실 수는 없다. -> 연속으로 2잔까지 마실 수 있다.
- 될 수 있는 대로 많은 양의 포도주를 마셔야한다.
입력
- 첫째 줄에 포도주 잔의 개수 n이 주어진다. (1 ≤ n ≤ 10,000)
- 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다.
- 포도주의 양은 1,000 이하의 음이 아닌 정수이다.
문제를 풀기 전
- 계단 오르기 문제와 비슷하다고 생각함!
- 해당 문제는 마지막 와인이 포함되어야 한다는 조건이 없는 것을 확인함!
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
"또 DP구나" 생각함!
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bufferedReader.readLine());
int[][] dp = new int[n + 1][3];
// dp[x][0] -> x번째 차례에 마시지 않겠다.
// dp[x][1] -> x번째 차례에 마시지만 직전에는 마시지 않았다.
// dp[x][2] -> x번째 차례에 마시고, 직전에도 마셨다.
int podoju; // 포도주의 양
// 아래 반복문에서 인덱스를 벗어나는 것을 피하기 위한 dp[1]을 직접 선언
podoju= Integer.parseInt(bufferedReader.readLine());
dp[1][0] = 0; // 선언하지 않아도 무방
dp[1][1] = podoju; // 선언해야함
dp[1][2] = 0; // 선언하지 않아도 무방
for (int i = 2; i <= n; i++) {
podoju = Integer.parseInt(bufferedReader.readLine());
// MAX(직전에 마시지 않은 경우, 직전에 마신 경우, 전전과 직전에 마신 경우)
dp[i][0] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][1], dp[i - 1][2]));
// 직전에 마시지 않은 경우 + 이번에 마시기
dp[i][1] = dp[i - 1][0] + podoju;
// 직전에 마신 경우 + 이번에 마시기
dp[i][2] = dp[i - 1][1] + podoju;
}
// 마지막 단계에서의 최대값 출력
System.out.println(Math.max(dp[n][2], Math.max(dp[n][0], dp[n][1])));
}
}
문제를 풀고 난 후
위 풀이는 dp 배열을 2차원으로 선언했으나, 포도주 입력을 배열로 저장한 후, dp 배열을 1차원으로 풀이된 것을 다른 분이 작성하신 포스팅으로 확인했다.
여러 방법이 있는 문제라고 생각함!
'백준' 카테고리의 다른 글
[백준 JAVA] 11729 : 하노이 탑 이동 순서 (0) | 2024.03.13 |
---|---|
[백준 JAVA] 1026 : 보물 (0) | 2024.03.12 |
[백준 JAVA] 14888 : 연산자 끼워넣기 (1) | 2024.03.11 |
[백준 JAVA] 2644 : 촌수계산 (0) | 2024.03.10 |
[백준 JAVA] 1138 : 한 줄로 서기 (0) | 2024.03.09 |