n = int(input())
dp = [[0] * 10 for i in range(n)] # 0~9의 인덱스를 가지고, n의 자릿수를 가진 이중 리스트 초기화.
dp[0] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1] # 한자리 숫자일 때 미리 초기화.
for i in range(1, n):
for j in range(10):
if j == 0: # 0이면 전 자릿수의 j+1 만 더함
dp[i][j] = dp[i - 1][j + 1]
elif j == 9: # 9 이면 전 자릿수의 j-1 만 더함
dp[i][j] = dp[i - 1][j - 1]
else: # 1~8 은 전 자릿수의 j-1, j+1 이 올 수 있으므로 두개를 더함
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j + 1]
print(sum(dp[n - 1]) % 1000000000) # 출력
코드 설명
이중 dp 리스트를 활용하여 문제를 풀이한다. 먼저 0~9의 인덱스를 가지는 리스트를 위해 *10 만큼 설정한다. 또한 자릿수를 위해 n만큼의 이중리스트를 생성한다.
한자리 숫자일 경우에는 1~9의 인덱스 모두가 자신이 계단수 이므로 1로 초기화 하여 준다. (0 인덱스는 사용하지 않는다)
두자리 숫자의 경우부터 반복을 진행하면서 조건에 맞게 점화식으로 계산한 후 출력한다.
Point : 2자리수 이상부터는 점화식을 통해 판별해야 한다.
만약 끝나는 수가 0이라면 이전 수에는 1만 올 수 있다. 9의 경우에는 이전 수로 8만 올 수 있다. 그 외의 경우에는 +- 1의 숫자가 올수 있다.
3가지의 case를 만들 수 있다.
case 1 : 마지막 자리가 0으로 끝나는 경우 -> 전 자릿수에 1만 올 수 있다. 따라서 dp[i-1][j+1] 의 값을 이용한다.
case 2 : 마지막 자리가 9로 끝나는 경우 -> 전 자릿수에 8만 올 수 있다. 따라서 dp[i-1][j-1]의 값을 이용한다.
case 3 : 그 외의 경우 -> dp[i-1][j-1] + dp[i-1][j+1] 의 값을 이용한다.
728x90
'SW개발 > 코딩테스트' 카테고리의 다른 글
[백준]11053번 가장 긴 증가하는 부분 수열 - DP (0) | 2021.02.14 |
---|---|
[백준]2156번 포도주 시식 - DP (0) | 2021.02.13 |
[백준]1463번 1로 만들기 - DP (0) | 2021.02.11 |
[백준]2579번 계단 오르기 - DP (0) | 2021.02.10 |
[백준]1932번 정수 삼각형 - DP (0) | 2021.02.09 |