43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
# 오르막 수
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
n = int(input().rstrip())
|
|
|
|
dp = [1]*10
|
|
|
|
for _ in range(1, n):
|
|
temp = dp[-1]
|
|
dp[-1] = sum(dp)
|
|
for i in range(8, -1, -1):
|
|
temp2 = dp[i]
|
|
dp[i] = dp[i+1] - temp
|
|
temp = temp2
|
|
|
|
print(sum(dp)%10007)
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 50분
|
|
|
|
시간 복잡도: 10자리의 dp 테이블을 n번만큼 반복하며 업데이트하기 때문에 O(10n)이다.
|
|
|
|
해설: 한 자리수 일때는 0~9까지 그냥 10개이다.
|
|
두 자리수 일때는 0일때 0~9, 1일때 1~9 ... 로 10개부터 1개까지 다 더한 55개이다.
|
|
세 자리수 일때는 0--일때, 55개, 1--일때, 11부터 99까지이므로 1~9 ... 1~1까지 45개이므로, 두 자리수 기준으로 0~9일때, 1~9일때.. 경우의 수를 가져온다.
|
|
그렇다는것은 자리수가 늘어날수록 10개의 수 기준으로 합이 정답이 된다는 뜻이다.
|
|
따라서 dp = [1]*10으로 해놓고, 자리수가 늘어날수록 합을 계속 계산하면 된다.
|
|
나는 논리 그대로 55에서 10을 빼고, 45에서 9를 빼고.. 순서로 가다보니 dp를 뒤에서부터 채우느라 temp가 2개 등장했지만,
|
|
사실 이게 앞에서부터 누적합을 계산하는 것이랑 똑같다.
|
|
|
|
수식으로 이해해보자면, dp[i][j]를 i자리수의 끝 숫자가 j일때 경우의 수로 생각해보면, dp[i][j] = dp[i-1][0] + dp[i-1][1] + .. + dp[i-1][j]이다.
|
|
이건 결국 전 행의 누적합을 의미한다. 또한 dp[i][j-1] = dp[i][0] + .. + dp[i][j-1]이므로, dp[i][j] = dp[i][j-1] + dp[i-1][j]가 된다.
|
|
따라서 1차원으로 만들면 dp[i] = dp[i-1] + dp[i](이전)이 된다.
|
|
""" |