[백준/파이썬] 10844번 쉬운 계단 수 풀이
업데이트:
문제 정보
- 문제 출처: 백준 온라인 저지
- 문제 링크: 10844번 쉬운 계단 수
- 문제풀이 코드 GitHub 링크
- 제출 언어: Python 3
풀이
문제
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가지 경우가 나올 것입니다. 이를 모두 더해주고 나눠준 후, 출력하면 됩니다.
원래는 나머지 연산이 수의 범위 때문에 들어간 것이기 때문에 각 반복마다 더하고 나눠줘야 하겠지만, 파이썬이므로 최후에 나눠주기만 해도 충분합니다.
댓글남기기