문제 설명
문제
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.
예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.
수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.
입력
첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.
출력
첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.
풀이 과정
- 2차원 배열 DP 문제이다.
- 점화식을 세워 보면, N번째 자리 숫자가 k라고 할 때, 가능한 경우의 수는 N-1번째 자리가 k 이상일때의 합계와 같다.
- 첫번째 자리가 1이라면, 두번째 자리는 1부터 9까지가 나올 수 있고, 2라면 2부터 9까지, ...
- 이 과정을 일의 자리에서부터 진행하면 된다.
- 일의 자리인 경우에는 DP[1][i] = 1이다.
- DP 테이블을 모두 채운 뒤, DP[N]의 합계를 구하면 된다. (길이가 N인 오르막 수의 개수)
소스 코드
import sys
input = sys.stdin.readline
N = int(input().rstrip())
dp = [[0] * 10 for _ in range(N+1)]
for i in range(10):
dp[1][i] = 1
for i in range(2, N+1):
for j in range(10):
for k in range(j, 10):
dp[i][j] = (dp[i][j] + dp[i-1][k]) % 10007
answer = sum(dp[N]) % 10007
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 11660 ] [ DP ] 구간 합 구하기 5 (0) | 2021.09.01 |
---|---|
[ 15990 ] [ DP ] 1, 2, 3 더하기 5 (0) | 2021.09.01 |
[ 2230 ] [ Two-Pointer ] 수 고르기 (0) | 2021.08.31 |
[ 10972 ] [ 순열 ] 다음 순열 (0) | 2021.08.30 |
[ 3986 ] [ Stack ] 좋은 단어 (0) | 2021.08.29 |