문제 설명
https://www.acmicpc.net/problem/11057
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수
www.acmicpc.net
해결 방향
DP문제이다.
백준 10844번(쉬운 계단 수)와 유사하다.
#include<iostream>
using namespace std;
#define mod 10007
int main() {
int N;
cin >> N;
int arr[1001][11];
for (int i = 0; i < 10; i++)
{ arr[1][i] = 1; }
for (int i = 2; i <= N; i++)
{
for (int j = 0; j <= 9; j++)
{
arr[i][j] = 0;
for (int k = 0; k <= j; k++)
{
arr[i][j] += arr[i - 1][k];
arr[i][j] %= mod;
}
}
}
int result=0;
for (int i = 0; i <= 9; i++)
{ result += arr[N][i]; }
cout << result%mod;
}
int arr[1001][11];
arr[i][j] = i번째에 숫자j가 있는 경우 오르막 수
for (int i = 0; i < 10; i++)
{ arr[1][ i ] = 1; }
한자리 일때는 무슨 숫자가 그 자리에 채워져도
한가지 경우의 수 밖에 없으므로
1로 지정해준다.
for (int i = 2; i <= N; i++)
{
for (int j = 0; j <= 9; j++)
{
arr[i][j] = 0;
for (int k = 0; k <= j; k++)
{ arr[i][j] += arr[i - 1][k];
arr[i][j] %= mod; }
}
}
2자리 이상(N>=2) 일때 결과값을 찾아보자.
마지막 자리에 0~9의 숫자가 올 경우 결과값을 구해야하는데
그 결과값은 그 앞자리에 마지막 자리 수보다 작은 수들의 결과값을 모두 합한것과 같다.
예를 들어
arr[4][3] = arr[3][3] + arr[3][2] + arr[3][1] + arr[3][0]
따라서
arr[N][n] = arr[N-1][n] + arr[N-1][n-1] + arr[N-1][n-2] + ... + arr[N-1][0]
임을 알 수 있고 다음과 같은 코드를 작성한 것이다.
arr[i][j] = 0;
for (int k = 0; k <= j; k++) { arr[i][j] += arr[i - 1][k]; }
int result=0;
for (int i = 0; i <= 9; i++) { result += arr[N][i]; }
결과값을 구하기 위해 N자리의 수에 0부터 9까지 들어갈 경우 나오는 결과값들을 모두 더한다.
'개발 > 백준' 카테고리의 다른 글
[백준] 9463번. 스티커 (C++) (0) | 2023.05.31 |
---|---|
[백준] 2193번. 이친수 (C++) (0) | 2023.05.23 |
[백준] 10844번. 쉬운 계단 수 (C언어) (0) | 2023.05.22 |
[백준] 11726번. 2xn 타일링 (C언어) (0) | 2023.05.21 |
[백준] 1463번. 1로 만들기 (C,C++) (0) | 2023.05.18 |