-
[1038] 감소하는 수BOJ 2022. 3. 26. 00:40
https://www.acmicpc.net/problem/1038
1038번: 감소하는 수
음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를
www.acmicpc.net
풀이가 꽤 다양하다.
10자리, 9자리만 하드코딩하고 브루트포스하는 방법,
한자리 수를 넣고 뒤에 하나씩 이어붙이며 bfs하는 방법,
2차원 dp, 백트래킹 등이 가능한것으로 보인다.
#include <stdio.h>#include <string.h>
#include <cmath>using namespace std;int dp[12][12];int f(unsigned long long n) {int a[15] = {0};int i = 0, j;while (n) {a[i] = n % 10;n /= 10;i++;}for (j = 0; j < i - 1; j++) {if (a[j + 1] - a[j] > 0) {} else {return false;}}return true;}int main(void) {int n, i, j, k, temp, num = 10, key = 0, x;scanf("%d", &n);if (n == 1022) {printf("9876543210");return 0;} else if (n > 1022) {printf("-1");return 0;}for (i = 0; i <= 9; i++) dp[1][i] = 1;for (i = 2; i <= 10; i++) {for (j = 0; j <= 9; j++) {temp = 0;for (k = 0; k <= j - 1; k++) temp += dp[i - 1][k];dp[i][j] = temp;num += temp;if (num >= n) {key = 1;break;}}if (key == 1) break;}x = (j + 1) * pow(10, (i - 1)) - 1;for (; num != n; x--) {if (f(x)) {num--;}}printf("%d", x + 1);return 0;}
'BOJ' 카테고리의 다른 글
[9370] 미확인 도착지 (0) 2022.03.29 [1719] 택배 (0) 2022.03.29 [5637] 가장 긴 단어 (0) 2022.03.25 [19236] 청소년 상어 (0) 2022.03.23 [2637] 장난감 조립 (0) 2022.03.23