Skip to content

Commit aadc575

Browse files
committed
feat: climbing-stairs 풀이 추가 (공간복잡도 최적화)
1 parent 5a2d2a1 commit aadc575

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

climbing-stairs/unpo88.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
class Solution:
2+
def climbStairs(self, n: int) -> int:
3+
if n <= 2:
4+
return n
5+
6+
prev2, prev1 = 1, 2
7+
8+
for i in range(3, n + 1):
9+
current = prev1 + prev2
10+
prev2 = prev1
11+
prev1 = current
12+
13+
return prev1
14+
15+
"""
16+
================================================================================
17+
풀이 과정 - 08:49 시작 ~ 08:54 종료 (5분 소요)
18+
================================================================================
19+
20+
1. 계단 올라갈건데, n step씩 올라감
21+
2. 1 또는 2단계씩 갈 수 있는데, 얼마나 많이 탑까지 올라갈 수 있는 방법이 있을까?
22+
3. 재귀로 내가 1 또는 2로 갈 수 있는 방법을 모두 구해야할 것 같은데?
23+
4. n - 1, n - 2
24+
5. 3번째 계단부터 첫 번째 계단 갈 수 있는 방법 + 두 번째 계단 갈 수 있는 방법
25+
6. DP로 풀어야할 것 같은데?
26+
7. 이거 계단 경우의 수 보니까 피보나치 수열이네?
27+
28+
29+
[1차 시도] 딕셔너리를 사용한 DP
30+
────────────────────────────────────────────────────────────────────────────────
31+
7. 피보나치 수열과 유사한 패턴 발견
32+
8. dp[i] = dp[i-1] + dp[i-2] 점화식 도출
33+
9. 기저 사례: dp[1] = 1, dp[2] = 2
34+
35+
dp = { 1: 1, 2: 2}
36+
for i in range(3, n + 1):
37+
dp[i] = dp[i-1] + dp[i-2]
38+
39+
return dp[n]
40+
41+
10. 정상적으로 통과되는 것 확인 완료
42+
43+
44+
[2차 개선] 공간 복잡도 최적화
45+
────────────────────────────────────────────────────────────────────────────────
46+
11. 잘 생각해보면 공간 복잡도를 아예 딕셔너리를 안만들고 푸는 방법도 있을듯?
47+
13. 변수 2개(prev2, prev1)로 공간 복잡도를 O(1)로 개선
48+
49+
if n <= 2:
50+
return n
51+
52+
prev2, prev1 = 1, 2
53+
54+
for i in range(3, n + 1):
55+
current = prev1 + prev2
56+
prev2 = prev1
57+
prev1 = current
58+
59+
return prev1
60+
61+
14. 공간 복잡도 O(n) → O(1)로 개선 완료
62+
15. 최종 통과 확인 완료
63+
"""

0 commit comments

Comments
 (0)