Thief of Wealth
Published 2020. 10. 5. 01:48
11057 오르막 수 개발/알고리즘

문제

오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.

입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.

출력

첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.

 

 

DP문제인 것을 알고 풀었으므로 바틈-업 방식으로 사고를 해보았다.

 

수많은 점화식을 짜본결과

dp[i][j]를 i길이의 숫자에서 맨왼쪽숫자가 j일때 오르막개수

로 정의하여 점화식을 세우고 연산을 진행했더니 답을 찾을 수 있었다.

 

혼자서 끝까지 점화식을 세우고 새벽까지 고민하여 푼 문제라서 뿌듯하다.

import sys
input = sys.stdin.readline

n = int(input())

dp = []
for _ in range(n+1):
  dp.append( [0]*(11) )

# dp[i][j] i길이의 숫자에서 맨왼쪽숫자가 j일때 개수

for i in range(1,11):
  dp[1][i] = 1

for i in range(2,n+1):
  for j in range(1,11):
    dp[i][j] = sum(dp[i-1]) - sum(dp[i-1][:j])

print(sum(dp[n])%10007)

'개발 > 알고리즘' 카테고리의 다른 글

1647 도시 분할 계획  (0) 2020.10.05
1197 최소 스패닝 트리  (0) 2020.10.05
10162 전자레인지  (0) 2020.10.04
1946 신입사원  (0) 2020.10.04
1541 잃어버린 괄호  (0) 2020.10.03
profile on loading

Loading...