본문 바로가기
알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 11057 오르막 수

by 로디네로 2021. 1. 4.
반응형

 

풀이일시 : 2020-12-28

 

 

문제 : 

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

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

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

 

 

입력 :

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

 

 

출력 : 

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

 

 

풀이 : 

DP문제이다. 

 

최대 1000 이므로 D[i][j] 일때 i는 1~1000 j는 맨 뒤의 숫자 즉 0~9가 될 것이다.

 

맨 뒤의 수 즉 j가 몇이냐에 따라 DP는 달라질 것이다.

 

이를 코드에서는 다 풀어놨는데 짧은 점화식을 만들어 쓸 수 있을것이다.

 

dbstndi6316.tistory.com/35

 

[개념정리] DP 동적프로그래밍

Dynamic Programing, DP, 동적프로그래밍, 동적계획법 으로 중요한 알고리즘 중 하나이다. ​ DP란 큰 문제를 작은 문제로 나눠서 푸는 알고리즘이다. 방식은 분할정복과 같으나 분할정복은 계산한 부

dbstndi6316.tistory.com

#include <iostream>

using namespace std;

int N;
const int MAX = 1001;
long long sum = 0;
long long DP[MAX][10];

void solution(){
	for (int i = 0; i <= 9; i++) {
		DP[1][i] = 1;
	}

	for (int i = 2; i <= N; i++) {
		for (int j = 0; j <= 9; j++) {
			//아래의 것도 for문 돌리면 되긴함 시각적으로 파악하기쉽게 다 풀어써놓음
			if (j == 0)
				DP[i][j] = DP[i - 1][0]; //항상 한가지 경우다. 맨뒤자리가(젤큰자리가) 0이면
			else if (j == 1)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1])%10007;
			else if (j == 2)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2]) % 10007;
			else if (j == 3)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3]) % 10007;
			else if (j == 4)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4]) % 10007;
			else if (j == 5)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4] + DP[i - 1][5]) % 10007;
			else if (j == 6)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4] + DP[i - 1][5] + DP[i - 1][6]) % 10007;
			else if (j == 7)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4] + DP[i - 1][5] + DP[i - 1][6] + DP[i - 1][7]) % 10007;
			else if (j == 8)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4] + DP[i - 1][5] + DP[i - 1][6] + DP[i - 1][7] + DP[i - 1][8]) % 10007;
			else if (j == 9)
				DP[i][j] = (DP[i - 1][0] + DP[i - 1][1] + DP[i - 1][2] + DP[i - 1][3] + DP[i - 1][4] + DP[i - 1][5] + DP[i - 1][6] + DP[i - 1][7] + DP[i - 1][8] + DP[i - 1][9]) % 10007;
		}
	}

	for (int i = 0; i <= 9; i++) {
		sum += DP[N][i];
	}
}

int main() {
	cin >> N;
	solution();
	cout << sum%10007 << '\n';
	return 0;
}
반응형

댓글