[백준/파이썬] 10844번 쉬운 계단 수 풀이

업데이트:



문제 정보


풀이

문제

45656이란 수를 보자.

이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.

세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)

  • 자세한 문제 및 입출력 예제는 상단의 문제 출처(백준 홈페이지)를 참조해주세요

코드

n = int(input())

dp = [[0]*10 for _ in range(n)]
dp[0] = [0] + [1]*9

for i in range(1, n):
    for j in range(10):
        if j == 0:
            dp[i][j] = dp[i-1][j+1]
        elif j == 9:
            dp[i][j] = dp[i-1][j-1]
        else:
            dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1]

s = 0
for i in range(10):
    s += dp[n-1][i]

print(s%1000000000)

설명

동적 계획법을 사용하면 쉽게 풀 수 있습니다.

문제의 조건에서, 0으로 시작하는 수는 없다고 했으므로 한자리 수 일때 0은 0, 나머지는 1로 초기화 해줍니다.

0과 9는 한 자리에 올 수 있는 범위의 양 극값입니다. 이 극값과 1만큼 차이 나는 수가 하나밖에 존재하지 않으므로, 경우의 수를 그대로 가져갑니다.

반면, 1~8은 1차이 나는 수가 모두 2개씩 있습니다. 이 경우, 이전 자리에서 가져올 수 있는 경우가 두가지가 될 것입니다. (ex. 23, 43)

이를 반복하면 n자리의 계단수가 마지막 자리가 0~9인 경우로 총 10가지 경우가 나올 것입니다. 이를 모두 더해주고 나눠준 후, 출력하면 됩니다.

원래는 나머지 연산이 수의 범위 때문에 들어간 것이기 때문에 각 반복마다 더하고 나눠줘야 하겠지만, 파이썬이므로 최후에 나눠주기만 해도 충분합니다.



댓글남기기