알고리즘/백준
[백준] 2579번 - 계단 오르기
땀두
2022. 3. 22. 07:51


dp문제이다. 한 번에 3개의 계단을 연속으로 오를 수 없다는 조건이 있기 때문에 이 조건에 유념하여 문제를 풀었다. 먼저 주어진 계단의 개수가 2개 이상인 경우에는 2번째 계단 까지의 값을 기본 값으로 지정해준다. 그 이후에는 두 가지 경우의 수가 있다. 첫 째는 2칸 전에서 올라오는 경우이고, 하나는 한 칸 전에서 올라오고 그 전은 두 칸을 점프한 경우이다. 이것 두 가지 값 중 큰 값을 저장해서 출력해주는 재귀함수를 작성하여 문제를 해결할 수 있다.
이 문제에서 메모이제이션이라는 기법을 사용하였는데, 작은 값들의 값을 특정 배열에 메모해두고 그 값을 이용하는 문제이다. 이 문제의 제약조건인 한 번에 3칸을 연속으로 밟지 못한다는 조건을 유념하여 메모를 할 배열에 값을 지정해나가면 해결할 수 있는 문제이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class p2579 {
public static int[] ary;
public static int[] dp;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
ary = new int[a + 1];
dp = new int[a + 1];
for (int i = 1; i <= a; i++) {
ary[i] = Integer.parseInt(br.readLine());
}
dp[1] = ary[1];
if (a >= 2) {
dp[2] = ary[1] + ary[2];
}
System.out.println(dp(a));
}
public static int dp(int a) {
if (dp[a] == 0 && a != 0) {
dp[a] = Math.max(dp(a - 2), dp(a - 3) + ary[a - 1]) + ary[a];
}
return dp[a];
}
}