Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 백트래킹
- dfs
- 조합
- 피보나치 수
- 큐
- 재귀
- SSAFY
- 중복 순열
- 분할 정복
- BeautifulSoup
- 문자열
- BFS
- DP
- 링크드리스트
- 세그먼트 트리
- 빠른 입출력
- 클래스
- 시뮬레이션
- 우선순위 큐
- 비트마스크
- 그리디
- 메모리풀
- lis
- 완전 탐색
- Knapsack
- 이분 탐색
- 크루스칼
- 스택
- 순열
- MST
Archives
- Today
- Total
작심 24/7
[백준] 11057번 오르막 수 본문
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수�
www.acmicpc.net
수의 길이가 증가할 때마다 고정되어 있는 것은 수의 맨 뒷자리이므로
맨 뒷자리를 기준으로 표를 그려보면
한 자릿수일 때
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
두 자릿수일 때
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ||
33 | 34 | 35 | 36 | 37 | 38 | 39 | |||
44 | 45 | 46 | 47 | 48 | 49 | ||||
... | ... | ... | ... | ... |
세 자릿수일 때
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
000 | 001 | 002 | 003 | 004 | 005 | 006 | 007 | 008 | 009 |
011 | 012 | 013 | 014 | 015 | 016 | 017 | 018 | 019 | |
111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | |
022 | 023 | 024 | 025 | 026 | 027 | 028 | 029 | ||
122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | ||
222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | ||
... | ... | ... | ... | ... | ... | ... |
이렇게 나타낼 수 있다.
표시된 부분을 예로 들자면
세 자릿수일 때 맨 뒷자리가 2인 경우는
세 자릿수일 때 맨 뒷자리가 1인 경우 + 두 자릿수일 때 맨 뒷자리가 2인 경우
이다.
여기서 필요한 것은 경우의 수이기 때문에
이차원 배열 DP를 만들어 첫 번째 인덱스는 자릿수, 두 번째 인덱스는 맨 뒷자리 숫자로 정하고
자릿수와 맨 뒷자리 숫자에 따른 경우의 수를 값으로 넣어주면
DP[i][j]=DP[i][j-1]+DP[i-1][j]
이라는 규칙을 도출해낼 수 있다.
이대로 구현하면 풀린다
#include <iostream>
using namespace std;
int main() {
int N;
cin >> N;
int dp[1001][10] = { 0 };
for (int i = 0; i < 10; i++) dp[0][i] = 1;
for (int i = 1; i < N; i++) {
dp[i][0] = 1;
for (int j = 1; j < 10; j++) {
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % 10007;
}
}
int sum = 0;
for (int i = 0; i < 10; i++) sum += dp[N - 1][i];
cout << sum % 10007;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 12865번 평범한 배낭 (0) | 2020.06.22 |
---|---|
[백준] 11051번 이항 계수 2 (0) | 2020.06.22 |
[백준] 1699번 제곱수의 합 (0) | 2020.06.22 |
[백준] 2294번 동전 2 (0) | 2020.06.21 |
[백준] 9465번 스티커 (0) | 2020.06.20 |
Comments