알고리즘/백준 문제풀이

[백준] 10844번 : 쉬운 계단 수 (python 파이썬)

매일_공부 2022. 3. 25. 18:03
반응형

 

https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

 

 

문제 정리 : 계단 수는 인접한 모든 자리의 차가 1인 수이다. 입력 값 N자리의 계단 수의 계수를 출력한다.

import sys
 
mod = 10**9 ## 십억
N=int(sys.stdin.readline())
mm=[[0]*10 for i in range(N+2)] ## 1-N의 자리까지의 수, 10은 각자리의 일의 자리 수

mm[1]=[0,1,1,1,1,1,1,1,1,1] ## N == 1인 경우

for i in range(2,N+1):
    mm[i][0] = mm[i-1][1] ## 일의 자리가 0인 경우
    mm[i][9] = mm[i-1][8] ## 일의 자리가 9인 경우

    for j in range(1,9):
        mm[i][j] = mm[i-1][j-1] + mm[i-1][j+1] ## 나머지 경우
    
   

print(sum(mm[N])%mod) ## 정답 출력

하나씩 따지기에는 개수가 너무 많으므로 일의 자리수를 기준으로 하여 차원을 더한다.

만약 이전 경우가 계단 수 였다면, 이번의 계단 수는 이전 계단 수의 일의 자리에서 1을 더하고 뺀 값을 1의 자리로 가질 것이다.

따라서 N = 1인 경우를 미리 만들어 놓고, dp 형식으로 계속 더해가는 형식을 통해 값을 구할 수 있다.

 

하지만 일의 자리가 0인 경우와 9인 경우는 특이점을 가진다.

0인 경우와 9인 경우는 1을 빼하고 더한 값이 서로 공유하기 때문에 수가 겹치는 문제가 발생할 수 있다. 0은 전에 1인 값에서 -1한 값으로 하고, 9는 전에 8인 값에서 +1 한 것으로 함으로서 이를 해결  수 있다.

반응형