[BOJ 2579] 계단오르기

업데이트:

문제

  • BOJ 2579
  • 문제의 저작권은 Baekjoon Online Judge에 있습니다.

접근방식

boj2579

현재 계단에서 구할 수 있는 최대값은 이전 계단 or 전전 계단을 선택한 두가지 경우의 수로 구할 수 있다.
이전 계단을 선택한 경우 연속 세개의 계단은 밟을 수 없으므로, 현재 인덱스가 i라면 i-1, i-3 계단을 밟을 수 있다.
이때, i-3계단을 오르기 까지 최대값을 DP배열에 저장해둔다면 i번째 계단에서의 최대 점수는 stairs[i]+stairs[i-1]+dp[i-3]가 된다.
전전 계단을 선택한 경우 현재 인덱스가 i라면 i-2 계단을 밟을 수 있다.
따라서 i-2계단을 오르기 까지 최대값을 DP배열에 저장해둔다면 i번째 계단에서의 최대 점수는 stairs[i]+dp[i-2]가 된다.
따라서, 이 두가지 경우 중 최대값을 선택한다면 현재 계단에서 최대 점수를 구할 수 있다.

코드

import java.util.Scanner;

//계단 오르기
//처음=>재귀: 시간초과
public class Main {

    static int N; //계단의 개수
    static int[] stairs;
    static int[] dp; //현재 계단에 올랐을때 최대값

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        stairs = new int[N+1];
        dp = new int[N+1];

        for(int i=1; i<=N; i++) stairs[i] = sc.nextInt();

        dp[1] = stairs[1];
        if(N >= 2) dp[2] = stairs[1] + stairs[2]; //계단이 한개일 수 있으므로

        //직전칸과 전전칸 중 최대값 저장
        for(int i=3; i<=N; i++) dp[i] = Math.max(stairs[i]+stairs[i-1]+dp[i-3], stairs[i]+dp[i-2]);
        System.out.println(dp[N]);
    }
}

태그:

카테고리:

업데이트: