본문 바로가기
알고리즘 문제

[알고리즘 문제] 백준1038 - 감소하는 수

by 박연호의 개발 블로그 2020. 10. 13.

 

www.acmicpc.net/problem/1038

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 ��

www.acmicpc.net

문제는 bfs를 사용하여 해결할 수 있습니다. 743이라는 이후의 숫자는 마지막숫자보다 작은 숫자들, 7432,7431,7430이 올 수 있습니다. 그리고 arr[j]의 값은 j번째 숫자를 의미하며 que를 순회하면서 마지막 숫자에 그보다 작은 숫자들을 하나씩 붙여가면서 반복합니다.

 

#include <iostream>
#include <queue>

using namespace std;

int main()
{

    int N;
    cin >> N;

    queue<long long> que;
    long long arr[1000001] = {0}; // j번째 숫자는 arr[j];

    if (N < 10)
    {
        cout << N << endl;
        return 0;
    }
    for (int i = 1; i <= 9; i++)
    {
        que.push(i);
        arr[i] = i;
    }

    int index = 9;

    while (index <= N)
    {
        if (que.empty())
        {
            break;
        }

        long long cur = que.front();
        que.pop();

        int tail = cur % 10;

        for (int i = 0; i < tail; i++)
        {
            que.push(cur * 10 + i);
            arr[++index] = cur * 10 + i;
        }
    }

    if (!arr[N])
    {
        cout << -1 << endl;
    }
    else
    {
        cout << arr[N] << endl;
    }

    return 0;
}