백준 10844 - 쉬운 계단 수 (Python3)
코드
n = int(input())
# n이 1 ~ 100까지의 자연수이므로
# dp테이블을 미리 101만큼 생성
d = [[0 for i in range(10)] for j in range(101)]
# n = 1일 때의 DP 테이블 초기화
for i in range(1, 10):
d[1][i] = 1
# i: 입력받을 n
for i in range(2, n+1):
# j: 숫자 0~9까지
for j in range(10):
# 0, 9 일 때는 별도 처리
# 0일 때 : 이전 까지의 dp테이블값 중 1의 값만 가지고 옴
if j == 0:
d[i][j] = d[i-1][1]
# 9일 때 : 이전 까지의 dp테이블 값 중 8의 값만 가지고 옴
elif j == 9:
d[i][j] = d[i-1][8]
else:
d[i][j] = d[i-1][j-1] + d[i-1][j+1]
print(sum(d[n]) % 1000000000)
문제 해설
DP 문제.
n자리의 수가 주어질 때, 연속적인 숫자들이 1씩 차이가 나는 수의 개수를 구하라는 문제이다.
아래의 풀이를 보자.
n자리 수가 주어질 때, 각 자리수를 이룰 수 있는 숫자는 당연히 0부터 9까지이며, 맨 첫자리가 0으로는 주어질 수 없다. 만약 어떠한 자리에 0이나 9가 주어진다면, 0에서 9는 이어지는 숫자가 아니므로 그 옆에 위치한 수는 각각 1 또는 8일 수 밖에 없다. 0이나 9가 아니라면, 당연히 앞과 뒤 숫자 총 2가지의 숫자가 주어질 수 있다. 즉, 자리수가 증가할 때 마다(n의 값이 1씩 증가할 때 마다) DP테이블의 값은 이전 DP테이블의 앞과 뒤의 숫자의 합으로 이루어진다. 따라서 DP테이블은 2차원으로 작성해야 한다.
이를 토대로 점화식을 세워보면 위 그림의 밑에 있는 파란색 글자가 되고, i가 0과 9일 때는 별도의 조건을 부여하여 문제를 해결하면 된다.
d[n][i]
- n : 주어진 자리 수
- i : 그 자리 수에 오는 숫자의 값
댓글남기기