45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
1) 계단수를 구하기 위해서는 맨 뒷자리 수를 제외한 나머지 두 자리 수의 계단수들이 필요하다.
2) 두 자리 수들의 계단수를 구하기 위해서는 맨 뒷자리 수를 제외한 한 자리 수의 계단수들이 필요하다
3) 한 자리 수들의 경우의 수를 구한다. 1 2 3 4 5 6 7 8 9
가 있으므로 경우의 수는 9
이다. 그리고 0부터 9까지의 수가 맨 뒷자리로 오는 경우를 테이블에 넣어본다.=> 0 1 1 1 1 1 1 1 1 1
4) 두 자리 수 계단수의 경우의 수를 구한다.
10
과 같은 결과가 나온다. 그렇다면 자리수가 한 자리수였을 때 1이 맨 뒤로 오는 경우의 수가 0이 맨 뒤로 오는 경우의 수이다. 경우의 수는 1
이다.21
과 같은 결과가 나온다. 그렇다면 자리수가 한 자리수였을 때 2가 맨 뒤로 오는 경우의 수는 1이므로 경우의 수는 1
이다.5) 세 자리 수 계단수의 경우의 수를 구한다.
# 백준 10844 쉬운 계단 수 / 실버1
# dp
# 인접한 모든 자리 차이가 1이 나는 계단 수 만들기
# N이 주어질 때 길이가 N인 계단 수가 몇 개 있을까?
# 첫째 줄에 N이 주어진다. N은 1이상 100이하
N = int(input())
# 이중 리스트 만들기
dp = [[0]*10 for _ in range(N+1)]
# 자리수가 하나일 때의 경우 집어넣기
for i in range(1, 10):
dp[1][i] = 1
# 자릿수에 따라, 0~9까지의 수가 맨 뒤에 올 수 있는경우의 수 구하기
for i in range(2, N+1):
for j in range(0, 10):
if j==0 :
dp[i][j]=dp[i-1][1]
elif j==9:
dp[i][j]=dp[i-1][8]
else:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]
#첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
print(sum(dp[N])%1000000000)
dp는 많이 풀어봐야 안다는데 맞는 거 같다..
문제 이해하는 데 3시간 걸림 (그 이상일수도)
그래도 이해하고 풀 수 있어서 뿌듯하다ㅎㅎ
하하하하하하