10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.
입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
코드
n = int(input())
dp = [[0] * 10 for _ in range(n+1)] # 길이가 i일 때 마지막 숫자가 j인 계단 수의 개수
dp[1] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 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]) % 1_000_000_000)
dp[i][j]에 숫자의 길이가 i일 때 마지막 자리의 숫자가 j인 계단 수의 개수를 저장한다.
점화식은 다음과 같다.
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
이때 주의할 점은 마지막 자리가 0인 경우에는 앞 자리 수가 1, 마지막 자리가 9인 경우는 앞 자리가 8인 경우 밖에 없으므로 점화식을 적용할 때 이 둘은 빼고 적용해야 한다.
'문제풀이 > DP' 카테고리의 다른 글
[Python/파이썬] 백준 22869번 징검다리 건너기 (small) (0) | 2023.04.11 |
---|---|
[Python/파이썬] 백준 21317번 징검다리 건너기 (0) | 2023.04.11 |
[Python/파이썬] 백준 9465번 스티커 (0) | 2023.04.10 |
[Python/파이썬] 백준 17069번 파이프 옮기기 2 (0) | 2023.02.15 |
[Python/파이썬] 백준 1890번 점프 (0) | 2023.02.13 |