(https://www.acmicpc.net/problem/2156)
같은 주간에 풀었던 계단오르기 문제와 다른 점은, 마지막 잔을 꼭 마셔야한다던가하는 조건이 없다.
계단 오르기 풀이
과거 KB에서 배웠전 구간합 풀이로 풀었다.
세가지 조건으로 나눴다.
1. 포도주가 1잔일 때 → 그 1잔이 최대
2. 포도주가 2잔일 때 → 1잔 + 2잔이 최대
3. 포도주가 3잔일 때 → 위 그림처럼 경우가 나뉘어질 수 있다.
- 검은 색이 마시는 포도주라고 했을 때, 3잔 연속으로 마실 수 없기에 저렇게 나뉘어진다.
- 4잔 이후부터는 반복되서 n~n-3을 한 묶음으로 Math.max를 이용해 최댓값 구했다.
- drink[i-3] + wine[i-1]+wine[i] = n-3, n-1, n번째 잔 마셨을 때
- drink[i-2] + wine[i] = n-3, n-2, n번째 잔 마셨을 때
- drink[i-1] = n-2, n-1 번째 잔 마셨을 때
→ drink[i-2] + wine[i-1] 로 나눌 필요가 없다. 이 경우는 n번째를 안 마시는 것이 주요한 경우라 생각했다. 그러니, n번째는 안마시면서 n-1번째 잔까지 최댓값을 구하는 경우라고 보면 될 듯하다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());//포도주 잔 개수
int[] wine = new int[n+1]; //각 포도주의 양
int[] drink = new int[n+1]; //효주가 마시는 양
for(int i=1;i<=n;i++) {
wine[i] = Integer.parseInt(br.readLine());
}
if(n==1) {
drink[1] = wine[1];
}
else if(n==2) {
drink[2] = wine[1]+wine[2];
}
else {
drink[1] = wine[1];
drink[2] = wine[1]+wine[2];
for(int i=3;i<=n;i++) {
drink[i] = Math.max(drink[i-2]+wine[i],Math.max(drink[i-1], drink[i-3]+wine[i-1]+wine[i]));
}
}
bw.write(drink[n]+"");
bw.flush();
bw.close();
}
}
}
}
선정된 문제들을 볼 때만 해도, 이걸 내가 풀 수 있을까.. 실버1...? 정답률 30퍼센트라니...
싶었는데, 그림 그리면서 차근차근 풀다보니 생각보다 풀만했던 문제였다! 역시 손으로 푸는게 제일이다 👍