읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
하위 문제 결과를 저장하는 배열 구성을 파악하지 못하면 해결하기 힘든 문제다. 보통 DP 배열을 1차원으로 작성하지만 이 문제는 길이 N의 계단 수를 생성할 때 길이 N - 1의 계단 수와 그 계단 수의 마지막 자리 수에 의존한다. 따라서, [길이][끝자리 수]
라는 2차원 배열로 관리하며 길이 N인 계단 수는 sum(dp[N])
이 될 것이다.
- dp 배열 초기화 (row = N + 1, col = 10)
- 초기 값은 dp[1] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
- 길이 2부터 만약 일의 자리 수가 0이나 9면 길이 i - 1 계단 수의 일의 자리 수가 1이거나 8이어야 한다. 나머지는 일의 자리수 k에 대해
dp[i - 1][k - 1] + dp[i - 1][k + 1]
이 성립한다. - 마지막까지 진행한 후
sum(dp[N])
출력
python 코드
import sys
input = sys.stdin.readline
N = int(input())
dp = [[0 for _ in range(10)] for _ in range(N + 1)]
for i in range(1, 10):
dp[1][i] = 1
for i in range(2, N + 1):
dp[i][0] = dp[i - 1][1]
dp[i][9] = dp[i - 1][8]
for j in range(1, 9):
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]
print(sum(dp[N]) % 1000000000)
'Algorithms > Baekjoon' 카테고리의 다른 글
BOJ #12865 평범한 배낭 (0) | 2021.07.28 |
---|---|
BOJ #11053 가장 긴 증가하는 부분 수열 (0) | 2021.07.26 |
BOJ #2156 포도주 시식 (0) | 2021.07.26 |
BOJ #1463 1로 만들기 (0) | 2021.07.26 |
BOJ #1149 RGB 거리 (0) | 2021.07.26 |