https://www.acmicpc.net/problem/10844
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
실버 1 문제다. 사실 실버 1이랍시고, 그냥 이 전에 있던 dp 문제들과 별반 다를 바 없었다. 저번 문제랑 굉장히 유사해서인지 구선생님의 도움 없이 혼자서 문제를 해결할 수 있었다. 이 문제 역시 2 자릿수던지, 3 자릿수던지 모두 이전 자리에 영향을 미친다. 어떻게 미치는지는 표로 알아보도록 하자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
우선 각각의 숫자로 만들 수 있는 1자리 수의 계단 수를 표로 나타낸 것이다. 1,2,3,4,5,6,7,8,9 모두 계단 수 이기 때문에 표에 1을 채워 넣을 수 있다. 2자리를 살펴보자. 2자리에서 만들 수 있는 계단 수는 10,12,23,21,34,32,45,43,56,54,67,65,78,76,89,87,98 총 17가지이다. 위의 숫자들을 바탕으로 어느 숫자부터 시작하는지를 표에 채워 넣어 보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
표가 위처럼 채워지는 것을 확인할 수 있다. 1로 시작하는 것은 10,12 2개. 2로 시작하는 것은 23,21 2개이기 때문에 표가 위처럼 완성될 수 있다. 2자리부터 계단수를 만들 때 어떻게 만들어지는 지를 잘 살펴보아야 한다. 1로 시작하는 10,12는 각각 0과 2가 붙은 수이다. 2로 시작하는 21,23 역시 1과 3이 붙은 수이다. 이전 인덱스의 옆항들이 더해져서 해당 인덱스의 항을 만드는 것을 알아볼 수 있다. 사실 여기까지 하고 점화식을 짠 뒤 코드를 짜도 무방하지만, 확실한 확인을 위해서 3자리까지 한번 확인을 해보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
0 | 3 | 4 | 4 | 4 | 4 | 4 | 4 | 3 | 2 |
1을 제외한 나머지 모든 항들이 생각한 가정에 부합하는 것을 확인할 수 있다. 사실 0도 0으로 시작하는 것이 없을 뿐이지 1 뒤에는 붙을 수 있기 때문에 9처럼 숫자를 넣어주면 된다. 위 가정들로 점화식을 짜 보면 0과 9를 제외하면
dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]
위를 성립하는 것을 알 수 있다.
import sys
n = int(sys.stdin.readline())
dp = [[0]*10 for i in range(n)]
dp[0] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
for i in range(1, n):
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])-dp[n-1][0]) % 1000000000)
dp [0]만 정의해주고 정해진 자릿수까지 for문을 돌려주면 답을 구할 수 있다. dp를 조금 이해하고 있다는 생각이 들어 뿌듯하다.
'Study > Python' 카테고리의 다른 글
programmers_level2_dbkey (0) | 2022.01.19 |
---|---|
백준 14002 (Python 파이썬) (0) | 2022.01.13 |
백준 15990 (Python 파이썬) (1) | 2022.01.10 |
백준 2089 (Python 파이썬) (0) | 2022.01.05 |
백준 1654 (Python 파이썬) (0) | 2022.01.01 |