(https://www.acmicpc.net/problem/2579)
같은 주간에 풀었던 포도주 시식 문제와 다른 점은, 마지막 도착 계단을 꼭 밟아야한다는 조건이 있다.
포도주 시식 문제 풀이
과거 KB에서 배웠전 구간합 문제가 생각이 났다.
세가지 조건으로 나눴다.
1. 계단이 1개일 때 → 그 1계단이 최대
2. 계단이 2개일 때 → 1계단 + 2계단이 최대
3. 계단이 3계단 이상일 때 → 위 그림처럼 경우가 나뉘어질 수 있다.
- 검은 색이 밟는 계단이라고 했을 때, 두가지로 나뉘어진다.
- n-1번째를 밟느냐 안밟느냐로 나뉘어진다.
- n = 3일 경우도 생각해서 n=3인 것까지 값을 초기화 시켜주고 i=4부터 반복문을 실행 시켰다.
- score[3] = 연속 3계단 밟을 수 없으니, 1번째 또는 2번째 중 최대 + 마지막인 3번째 계단
- score[i-3] + wine[i-1] = n-3, n-1 번째 계단 밟았을 때
- score[i-2] = n-3, n-2번째 계단 밟았을 때
→ 3가지 경우 모두 마지막에 step[i]를 더해서 마지막 계단을 밟아줘야한다.
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[] step = new int[N+1];
int[] score = new int[N+1];
for(int i=1;i<=N;i++) {
step[i] = Integer.parseInt(br.readLine());
}
if(N == 1) {
score[1] = step[1];
}
else if(N == 2) {
score[2] = step[1]+step[2];
}
else {
score[1] = step[1];
score[2] = step[1]+step[2];
score[3] = Math.max(step[1], step[2])+step[3];
for(int i=4;i<=N;i++) {
score[i] = Math.max(score[i-3]+step[i-1], score[i-2])+step[i];
}
}
bw.write(score[N]+"");
bw.flush();
bw.close();
}
}
마지막 계단을 꼭 밟아주다 보니, 포도주 시식 문제와는 다르게 생각할 경우가 그림으로는 좀 적었다! 하지만 1계단일 경우, 2계단일 경우를 생각하지 못하고 if문으로 나눠주지 않았더니 런타임 에러가 나왔다.
그리고 계단이 두개만 있을 경우에는 2번째 계단을 밟는 것이 최대다! 라는 말도 안되게 초기화를 해둬서..🙃 틀렸당