티스토리 뷰
https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수�
www.acmicpc.net
오르막 수는 수의 자리가 오름차순을 이루는 수.
인접한 수가 같아도 오름차순으로 친다.
그리고 이 문제는 0으로 시작할수 있다.
n = 1 일때
0
1
2
...
9
n = 2 일때
01, 02, ... 09 // 9개
12, 13, ... 19 // 8개
23, 24, ... 29 // 7개
...
89 // 1개
나는 이차원 배열의 첫번 째 인덱스를 수의 길이, 두 번째 인덱스를 수의 첫자리로 사용했다.
위에서 보면 n = 1일때 0이고 n = 2일때는 0뒤에 0보다 큰 값들 (오르막수이기 때문에)이 올 수 있으므로
01, 02, ... 09가 되고 총 9개다.
n = 1일때 1이면 뒤에 1 보다 큰 수들이 올 수있고 n = 2 일때 12, 13, ... 19 가 되고 총 8개다.
이렇게 앞자리가 1씩 커질수록 뒤에 올 수 있는 수의 개수가 1씩 적어진다.
d = [[0] * 10 for i in range(1001)] # 1001 x 10
for i in range(10): # base
d[1][i] = 1
def dp(a, b):
for i in range(9, b - 1, -1):
d[a][b] += d[a - 1][i]
return d[a][b]
n = int(input()) # input
for i in range(2, n + 1, 1):
for j in range(10):
d[i][j] = dp(i, j)
res = 0
for i in range(10):
res += d[n][i]
print(res % 10007)
n = 1일때는 어처피 두 번째 인덱스는 상관없이 모두 1가지만 있을수 있으므로 d[1]은 다 1로 채운다.
for문이 돌면서 dp함수를 호출해서 d[][]를 채운다.
예를들어 n = 2이면,
d[2][0]에는 d[1][9], d[1][8] ... d[1][0]이 더해져 9가되고,
d[2][1]에는 d[1][9], d[1][8] ... d[1][1]이 더해져 8이 된다.
Solution
d[n] : 길이가 n 자리인 수 중에서 오르막수의 총 개수
이 문제도 숫자의 마지막 자리의 수가 몇인지가 중요하다.
그래서 d[n][k]에서 n은 길이, k는 마지막 자리의 값으로 둔다.
그래서 우리가 구하는 값은
d[n] = d[n][0] + d[n][1] + ... + d[n][9]
중요한 것은 d[n][k] 에서 k 값이 d[n-1][i]의 i 값보다 크거나 같아야 '오르막 수' 가 된다는 것이다.
즉 d[n][k] = d[n-1][0] + d[n-1][1] + ... + d[n-1][k]
d = [[0] * 10 for a in range(1001)]
for a in range(10): d[1][a] = 1 # 길이 1일때는 모두 1
mod = 10007
n = int(input())
for i in range(2, n+1):
for k in range(10):
for j in range(k + 1):
d[i][k] += d[i-1][j]
d[i][k] %= mod # 배열에 넣을때부터 애초에 10007 나머지 넣는다
sum = 0
for i in range(10): sum += d[n][i]
'PS' 카테고리의 다른 글
| 9465. 스티커 (0) | 2020.08.10 |
|---|---|
| 2156. 포도주 시식 (0) | 2020.08.10 |
| 10844. 쉬운 계단 수 (0) | 2020.08.06 |
| 11052. 카드 구매하기 (0) | 2020.08.06 |
| 백준 2193. 이친수 (0) | 2020.08.06 |
- Total
- Today
- Yesterday
- 이분탐색
- C++
- priority queue
- Implementation
- Stack
- BFS
- Tree
- Brute Force
- recursion
- greedy
- MVC
- permutation
- back tracking
- two pointer
- C
- CSS
- Python
- binary search
- Spring
- Unity
- 재귀
- Kruskal
- DP
- Dijkstra
- dfs
- graph
- floyd warshall
- 자료구조
- db
- 조합
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
