Programming/백준
백준 10844 - 쉬운 계단 수 (파이썬)
pental
2025. 2. 23. 13:49
분류 : 다이나믹 프로그래밍
https://www.acmicpc.net/problem/10844
풀이
먼저 문제 이해를 하면 다음과 같다.
- 계단 수는 인접한 모든 자리의 차이가 1인 수이다.
- N이 주어질 때, 깊이가 N인 계단 수의 갯수를 구하는 문제이다.
- 0으로 시작하는 수는 계단 수가 아니다.
- 결과는 10^9로 나눈 나머지를 출력해야한다.
문제 풀이를 위해서 DP 알고리즘을 사용한다.
- dp[i][j]를 길이가 j이고 마지막 숫자가 i인 계단 수의 갯수라고 정의한다.
- 점화식을 세우면 다음과 같다.
- dp[j][i] = dp[j-1][i-1] + dp[j+1][i-1]
- 즉, 길이가 i이고 끝자리가 j인 계단 수는 이전 자리(i-1)에서 끝자리가 j-1이거나 j+1이었던 경우의 합이다.
- 초기 조건으로는
- dp[0][1] = 0 (0으로 시작하는 계단 수는 불가능)
- dp[i][1] = 1 (1~9까지의 숫자는 각각 한 자리 계단 수)
시간 복잡도 분석
- N의 최대값은 100
- dp 배열의 크기는 10 x N
- 이중 for 루프 (10 * N번 연산)
- 시간 복잡도: O(N)
- O(N)O(N)
코드
# 백준 10844 - 쉬운 계단 수
# 분류 : 다이나믹 프로그래밍
import sys
input = sys.stdin.readline
N = int(input())
mod = 1000000000
dp = [[0] * (N + 1) for _ in range(10)] # 10 x (n + 1) 배열
dp[0][1] = 0
for i in range(1, 10) :
dp[i][1] = 1
for i in range(2, N + 1) :
for j in range(10) :
dp[j][i] = 0
if j > 0 :
dp[j][i] += dp[j - 1][i - 1]
dp[j][i] %= mod
if j < 9 :
dp[j][i] += dp[j + 1][i - 1]
dp[j][i] %= mod
answer = 0
for i in range(10) :
answer += dp[i][N]
answer %= mod
print(answer)