문제 설명
주어진 계단의 수 n에 대해, 한 번에 1계단 또는 2계단을 오를 수 있을 때 계단을 올라가는 방법의 수를 구하는 문제입니다.
예를 들어:
- 계단이 2개라면:
- 가능한 방법: [1+1], [2] → 총 2가지
- 계단이 3개라면:
- 가능한 방법: [1+1+1], [1+2], [2+1] → 총 3가지
풀이 접근 방법
이 문제는 작은 문제를 해결하며 답을 확장해 나가는 **Dynamic Programming(DP)**의 핵심 원리를 활용합니다.
아이디어
- 계단 i에 도달하려면:
- 바로 전 계단 i-1에서 1계단 올라오거나,
- 두 칸 아래 계단 i-2에서 2계단 올라오는 방법이 있습니다.
- 따라서, 점화식은 다음과 같습니다:dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i-1] + dp[i-2]
- dp[i]는 계단 i까지 올라가는 방법의 수를 의미합니다.
- 초기값:
- dp[0] = 1: 계단이 없으면 올라갈 방법은 1가지(그냥 아무것도 안 하기).
- dp[1] = 1: 계단 1개일 때 올라가는 방법은 1가지.
코드 구현
class Solution {
public int climbStairs(int n) {
// 초기화
int[] dp = new int[n + 1];
dp[0] = dp[1] = 1;
// 범위 처리
if(n == 0 || n== 1 ) return 1;
// 다이나믹
for(int i = 2 ; i <= n ; i ++) {
// ex n=3, 2층까지 올라가는 수 + 1층 올라가는 수
dp[i] = dp[i -1] + dp[i - 2];
}
return dp[n];
}
예제: 계단이 4개라면
초기화
- dp[0] = 1 (방법: 아무것도 안 하기)
- dp[1] = 1 (방법: 1계단)
계산 과정
- i = 2:
- dp[2] = dp[1] + dp[0] = 1 + 1 = 2
- 방법: [1+1], [2] → 총 2가지
- i = 3:
- dp[3] = dp[2] + dp[1] = 2 + 1 = 3
- 방법: [1+1+1], [1+2], [2+1] → 총 3가지
- i = 4:
- dp[4] = dp[3] + dp[2] = 3 + 2 = 5
- 방법: [1+1+1+1], [1+1+2], [1+2+1], [2+1+1], [2+2] → 총 5가지
결과
- 최종적으로, dp[4] = 5.
- 계단 4개를 올라가는 방법은 총 5가지입니다.
최적화 가능성
위 코드는 O(n)O(n)의 시간 복잡도와 O(n)O(n)의 공간 복잡도를 가집니다. 하지만 공간 복잡도를 줄이려면, 배열 대신 두 개의 변수만 사용할 수도 있습니다.
최적화된 코드:
class Solution {
public int climbStairs(int n) {
// 초기화
int prev1=1, prev2 = 1;
int current = 0;
// 범위 처리
if(n == 0 || n== 1 ) return 1;
…
}
}
- 이 코드는 공간 복잡도를 O(1)O(1)로 줄여줍니다.