파이썬 / BOJ 백준 / 10844번 쉬운 계단 수 - dp
https://www.acmicpc.net/problem/10844
문제
45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
풀이
1. DP(동적계획법)을 이용해 풀 수 있는 문제입니다. DP테이블은 이차원 리스트이며 DP[자리 수][앞에 오는 숫자]=경우의 수로 표현합니다.
2. 앞에 오는 숫자 = 0이면 아래와 같은 식으로 표현합니다. 0 다음에는 1밖에 올 수 없습니다.
DP[자리 수][0] = DP[자리 수 - 1][1]
맨앞에는 0이 올수 없고, 그 아래 자리수부터는 0이 올 수 있으니, 맞교환하는 식으로 하여, 간단하게 식을 만듭니다.
3. 앞에 오는 숫자 = 1~8 이면 아래와 같은 식으로 표현합니다. 1 ~ 8은 각각 2개씩 올 수 있습니다.
DP[자리 수][앞에 오는 숫자] = DP[자리 수 - 1][앞에 오는 숫자 -1] + DP[자리 수 - 1][앞에 오는 숫자 + 1]
4. 앞에 오는 숫자 = 9이면 아래와 같은 식으로 표현합니다.
DP[자리 수][9] = DP[자리 수 - 1][8]
5. 마지막에 DP[자리수]에 있는 값을 모두 더하고, 1000000000의 나머지를 구해줍니다.
전체 코드
n = int(input())
dp = [[0 for i in range(10)] for j in range(101)]
for i in range(1, 10):
dp[1][i] = 1
for i in range(2, n + 1):
for j in range(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]
#print(dp[i])
print(sum(dp[n]) % 1000000000)
'BOJ 백준 알고리즘 > 동적 프로그래밍 DP' 카테고리의 다른 글
파이썬 / BOJ 백준 / 11053 가장 긴 증가하는 부분 수열 - dp (0) | 2021.08.23 |
---|---|
파이썬 / BOJ 백준 / 2156 포도주 시식 - dp (0) | 2021.08.22 |
파이썬 / BOJ 백준 / 1463번 1로 만들기 - dp (0) | 2021.08.20 |
파이썬 / BOJ 백준 / 2579번 계단 오르기 - dp (0) | 2021.08.19 |
파이썬 / BOJ 백준 / 1932번 정수 삼각형 - dp (0) | 2021.08.18 |