45656이란 수를 보자.
이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.
세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.
N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
처음에는 문제 이해를 잘못해서 식을 어떻게 그려봐야하나 한참 고민했다.
역시 나는 문제를 잘읽는 습관을 들이도록 노력해야한다.
이 문제는 숫자들이 각 자리가 각각 1씩만 차이나도록 해야하기 때문에, 0부터 9까지 9개의 경우를 나누어 입력하는 N이 증가하는 경우에 따라 표(?)를 그려보면 규칙을 찾을 수 있었다.
0 1 2 3 4 5 6 7 8 9
N = 1) 0 1 1 1 1 1 1 1 1 1
N = 2) 1 1 2 2 2 2 2 2 2 1
N = 3) 1 3 3 4 4 4 4 4 3 2
이런 식으로 숫자들이 이어지는 것을 알 수 있는데, 이를 자세히 살펴보면 N = 2인 부분부터 각각의 숫자들은 바로 위 숫자들 중, 자기 자신의 왼쪽과 오른쪽 대각에 있는 숫자의 합임을 알 수 있다.
또한 0이나 9는 각각 오른쪽, 왼쪽의 대각의 숫자와 같음을 알 수 있다.
이를 이용하여 코드를 작성해보았다.
import copy
n = int(input())
dp = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
if n == 1:
print(9)
else:
for j in range(1, n):
dp_copied = copy.deepcopy(dp)
for i in range(10):
if i == 0:
dp[i] = dp_copied[1]
elif i == 9:
dp[i] = dp_copied[8]
else:
dp[i] = dp_copied[i-1] + dp_copied[i+1]
print(sum(dp)%1000000000)
바로 위의 대각에 있는 숫자들을 가져오기 위해 copy 모듈을 import하여 deepcopy를 이용했다.
메모리는 29756kb, 시간은 88ms로 나름 적당한 결과를 얻을 수 있었다.