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