문제
Climbing Stairs - LeetCode
Can you solve this real interview question? Climbing Stairs - You are climbing a staircase. It takes n steps to reach the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Example 1: Input: n = 2 Outpu
leetcode.com
- 계단을 1칸 또는 2칸씩 올라갈 수 있다. n개의 계단을 올라가는 모든 경우의 수를 구하여라
아이디어
1. 초항은 1칸을 오른다. 하나뿐이다. 이항은 1+1, 2로 두 가지로 고정되어 있다.
2. 곰곰이 생각해보니, 루트는 무조건 두 가지로 고정된다.
- 2칸 전에서 2칸을 오른다.
- 1칸 전에서 1칸을 오른다. (2칸전에서 1칸 오르고 다시 1칸 오르는 경우의 수는 이미 여기 포함되어있다.)
따라서, 2칸 전의 경우의 수 + 1칸 전의 경우의 수가 현재 칸에서의 총 경우의 수가 된다.
3. 이를 수식으로 표현하면. dp[n] = dp[n-1] + dp[n-2] 로 표현할 수 있다.
구현(풀이)
var climbStairs = function(n) {
let dp = [1,2]
const fillDP = (x) => {
let k = dp.length
while (k < n) {
k +=1
dp.push(dp[k-2]+dp[k-3] )
}
}
fillDP(n)
return dp[n-1]
};
1. 배열이 0 ~ n-1 이다보니 코드 상에서는 n-2, n-3으로 구현되었다.
2. dp라는 배열(초기값 1,2)에 n이 나올때까지 반복문을 돌리면서 해당 계단에 필요수를 만든다.
3. 마지막 값을 리턴한다.
남의 풀이
var climbStairs = function(n) {
if (n < 2) {
return 1;
}
let firstStep = 1;
let secondStep = 1;
let thirdStep = 0;
for (let i=2; i<=n; i++) {
thirdStep = firstStep + secondStep;
firstStep = secondStep;
secondStep = thirdStep;
}
return thirdStep;
};
- 나중에 알고보니 피보나치 수열이었다.
- 속도는 비슷한데 배열을 사용하지 않으니 확실히 메모리 측면에서 차이가 났다. 현재 문제는 n이 45이하인데, 더 컸다면 더 큰 차이가 발생했을 거 같다.
'TIL > 이전 풀이' 카테고리의 다른 글
| [js] Leetcode 1143. Longest Common Subsequence (1) | 2023.05.17 |
|---|---|
| [js] Leetcode 300. Longest Increasing Subsequence (0) | 2023.05.16 |
| [js] Leetcode 11. Container With Most Water (0) | 2023.04.27 |
| [js] Leetcode 289. Game of Life (0) | 2023.04.26 |
| [js] Programmers_Lv.0_구슬을 나누는 경우의 수 (1) | 2023.04.04 |