BOJ

2579

계단 오르기

문제분석

문제분석

 

 

입력의 첫째 줄에 계단의 개수가 주어진다.

둘째 줄부터 한 줄에 하나씩 제일 아래에 놓인 계단부터 순서대로 각 계단에 쓰여 있는 점수가 주어진다. 계단의 개수는 300이하의 자연수이고, 계단에 쓰여 있는 점수는 10,000이하의 자연수이다.

문제풀이 아이디어

 

브루트 포스로 풀게 되면 O(2^계단의 개수) 수행시간에 수행되므로 시간초과가 뜨게 될 것이다.

따라서 dp로 풀어야한다.

dp[i][0] == i 번째 계단을 밟지 않고 i+1번째 계단까지 밟았을 때 더한 점수들의 최대값.

dp[i][0] == i 번째 계단을 밟고 i+1 번째 계단까지 밟았을 때 더한 점수들의 최대값.

 

문제풀이 아이디어

 

점화식

 
dp[pos][1] = dp[pos - 1][0] + arr[pos];
dp[pos][0] = max(dp[pos - 2][1], dp[pos - 2][0]) + arr[pos];

소스코드

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int t, arr[30010], dp[30010][2], pos = 0, result;
    scanf("%d", &t);
    for (int i = 0; i < t; ++i) {
        scanf("%d", &arr[i]);
    }
    dp[0][0] = arr[0];
    dp[1][0] = arr[1];
    dp[1][1] = arr[0] + arr[1];
    for (int i = 2; i < t; ++i) {
        pos = i;
        dp[pos][1] = dp[pos - 1][0] + arr[pos];
        dp[pos][0] = max(dp[pos - 2][1], dp[pos - 2][0]) + arr[pos];
    }
    result = max(dp[t - 1][0], dp[t - 1][1]);
    printf("%d", result);
}

분석 및 결과

알고리즘 시간 복잡도 == O(계단의 수)

 

 

p.s) 알고리즘 시간 복잡도가 빠르다고 수행속도가 빠른 것은 아닙니다. 헷갈리시면 안돼여~

ex)퀵소트(O(n^2))가 머지소트(O(nlogn)) 보다 평균적으로 더 빠름

BOJ2579계단 오르기

By mingyun chae

BOJ2579계단 오르기

  • 537