# Recursion: Davis' Staircase
# Question
https://www.hackerrank.com/challenges/ctci-recursive-staircase/problem Davis는 한번에 1, 2, 3칸을 오를 수 있다. N칸을 오를 때의 경우의 수를 구해라
# Answer
재귀로 풀라고 힌트를 줬는데 잘 모르겠어서 구글에 '계단 오르기 알고리즘'을 검색했다. Dynamic Programming으로 푸는 법이 나왔는데 잘 이해가 안 갔다. (재귀로 푼 다음 스텝이라 카더라) '계단 오르기 재귀'하니까 드디어 접근법이 이해가 갔다.
5개 계단을 오르는 경우의 수 = 2번째 계단에서 3칸 오르기 + 3번째 계단에서 2칸 오르기 + 4번째 계단에서 1칸 오르기
이니까 f(n) = f(n-3) + f(n-2) + f(n-1)
이며, base case는 계단 수가 1, 2, 3일때를 적어두면 될것이다.
처음엔 간단하게 재귀로만 풀었다.
function fn(num) {
if(num == 1) return 1;
else if(num == 2) return 2;
else if(num == 3) return 4;
return fn(num-1) + fn(num-2) + fn(num-3)
}
그랬더니 35계단만 올라가도 4.4s가 걸리는 것이었다. 재귀는 호출을 엄청 많이 하기 때문에 수가 커질수록 성능이 구리다.
그래서 캐시드 오브젝트를 만들었다.
let cachedObj = {1:1, 2:2, 3:4};
function fn(num) {
if(Object.keys(cachedObj).indexOf(String(num)) >= 0) {
return cachedObj[num];
} else {
let answer = fn(num-1) + fn(num-2) + fn(num-3);
cachedObj[num] = answer;
return answer;
}
}
굿 이제 0.1s로 줄었다.