
문제가 짧다고 쉬울거라고 생각이 든다면 경기도 오산이다.
이해하기가 어려웠다.
1. 입력 받은 N을 자리수로 생각한다.
2. 인접한 숫자간 차이는 1이다.
위 두가지를 기준으로 생각해야한다. 첫째 줄 N... 너무 헷갈렸다.
n=1 일 때, 한 자리수로 만들 수 있는 계단수
1,2,3,4,5,6,7,8,9
계단수는 총 9개이다.
n=2 일 때, 두 자리수로 만들 수 있는 계단수
1:
1을 기준으로 : 10, 12
2:
2를 기준으로 : 21, 23
3:
3을 기준으로 : 32, 34
4:
4를 기준으로 : 43, 45
5:
5를 기준으로 : 54, 56
6:
6을 기준으로 : 65, 67
7:
7를 기준으로 : 76, 78
8:
8를 기준으로 : 87, 89
9:
9를 기준으로 : 98
계단수는 총 17개이다.
n=3 일 때, 세 자리수로 만들 수 있는 계단수
1: 10, 12,
10을 기준으로 : 101,
12를 기준으로 : 123, 121
2: 21, 23
21을 기준으로 : 210, 212
23을 기준으로 : 232, 234
3: 32, 34
32를 기준으로 : 321, 323
34를 기준으로 : 343, 345
4: 43, 45
43을 기준으로 : 432, 434
45를 기준으로 : 454, 456
5: 54, 56
54를 기준으로 : 543, 545
56을 기준으로 : 565, 567
6: 65, 67
65를 기준으로 : 654, 656
67를 기준으로 : 676, 678
7: 76, 78
76을 기준으로 : 765, 767
78을 기준으로 : 787, 789
8: 87, 89
87을 기준으로 : 876, 878
89를 기준으로 : 898
9: 98
98를 기준으로 : 989, 987
계단수는 총 32개이다.
문제에서 구하고자 하는 계단수는 끝 자리의 값을 기준으로 +1,-1 한 값이다.
끝자리가 3이라면 2 또는 4, 끝자리가 2라면 1 또는 3이다.
import sys
input = sys.stdin.readline
N = int(input())
dp = [[0]*10 for i in range(N+1)]
# n=1 일 때 1로 초기화
for i in range(1,10):
dp[1][i] = 1
for j in range(2,N+1):
# 0부터 9까지 반복하면서 값을 넣어준다.
for k in range(10):
if k==0:
dp[j][k] = dp[j-1][1]
elif k==9:
dp[j][k] = dp[j-1][8]
else:
dp[j][k] = dp[j-1][k-1] + dp[j-1][k+1]
print(sum(dp[N]) % 1000000000)
위 코드의 점화식은 아래와 같다.
dp[자리수][앞숫자] = dp[자리수-1][앞숫자-1] + dp[자리수-1][앞숫자+1]
문제가 진짜 너무너무너무너무 어려웠다.
이 문제는 풀었다기 보다는 이해했다가 맞을 것 같다.
을 정독, 정독 또 정독하였다.
이 문제 때문에 블로그에 방문했다면 위 두 링크도 확인하면 좋을 것 같다.

'Algorithm > BaekJOON(Python)' 카테고리의 다른 글
[백준/DP/2193] 이친수 (0) | 2022.06.05 |
---|---|
[백준/DP/11057] 오르막 수 (0) | 2022.06.03 |
[백준/DP/9095] 1, 2, 3 더하기 (0) | 2022.05.30 |
[백준/DP/11727] 2×n 타일링 2 (0) | 2022.05.12 |
[백준/DP/11726] 2×n 타일링 (0) | 2022.05.11 |