링크: https://www.acmicpc.net/problem/10844
유형: 동적프로그래밍
작성일시: 2022년 10월 15일 오후 11:21
출처 : 백준 온라인 저지
input : N (1≤N≤100)
output: 정답을 1,000,000,000로 나눈 나머지
input
1
2
output
9
17
모든 경우의 수를 구하는 것이다. 근데 하나하나 다 풀려고 하면 너무 복잡해진다.
각각의 케이스를 구해보자. N이 1일 때, 자리수가 1이기 때문에 각 숫자들이 맨 뒷자리에 올 수 있는 개수는 1씩이다.
i \ j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
3 | 1 | 3 | 3 | 4 | 4 | 4 | 4 | 4 | 3 | 2 |
따라서 이를 이용해서 테이블을 만들고 해당 점화식을 세운다!
i = 자리수(N)
, j = 맨 뒤에 갈 수 있는 경우의 수
j = 0 → num[i][j] = num[i-1][1]
j = 9 → num[i][j] = num[i-1][8]
j = 2~8 → num[i][j] = num[i-1][j-1] + num[i-1][j]
n = int(input())
num = [[0]*10 for _ in range(n+1)]
num[0] = [1,1,1,1,1,1,1,1,0] #0행에 들어가는 값들을 계단수의 경우의수로 초기화
for i in range(1,n+1):
for j in range(10): #0일때, 9일때, 나머지인 경우를 점화식을 토대로 코드 작성
if j == 0:
num[i][j] = num[i-1][1]
elif j == 9:
num[i][j] = num[i-1][8]
else:
num[i][j] = num[i-1][j-1] + num[i-1][j]
answer = sum(num[n]) % 100000000
print(answer)
이 풀이는 런타임에러가 난다.
n = int(input())
num = [[0]*10 for _ in range(n+1)]
num[0] = [0,1,1,1,1,1,1,1,1]
for i in range(1,n+1):
for j in range(10):
if j == 0:
num[i][j] = num[i-1][j+1]
elif j == 9:
num[i][j] = num[i-1][j-1]
else:
num[i][j] = num[i-1][j-1] + num[i-1][j+1]
answer = sum(num[n]) % 100000000
print(answer)
이 문제는 동적계획법에 대한 예제이다. 직접 다 풀지는 못했지만, 동적계획법이 어떤 것인지 알게 되었다.
여러 번 반복되는 경우, 테이블이나 배열을 이용하여 기억공간에 저장해두었다가 불러올 수 있다는 것을 알게 되었다.