[ 백준 ] 1174 / 줄어드는 숫자

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
173/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 1174 / 줄어드는 숫자
 *
 * Kind :: Math
 *
 * Insight
 * - max(줄어드는 숫자) = 9876543210
 *   + 숫자의 범위를 보니 long 을 써야 겠다
 *
 * - 총 몇개일려나...?
 *   + 잘 모르겠다... 일단 다 구해보자
 *     # 구해보니 1023 개다
 *       -> 그리 많지 않네...?
 *
 * Point
 * - 줄어드는 숫자를 구할 때 BFS 를 사용해서 구현했다
 *   + 3 이 있으면,
 *     => 32 / 31 / 30
 *     => 321, 320 / 310 / X
 *     => 3210 / X / X
 *     => X / X / X
 *     # 일의자리 숫자를 보고 그 숫자보다 작은 숫자들을 뒤에 붙여주었다
 *       코드에서는 따로 sort 할 필요가 없도록
 *       붙여주는 숫자가 0 부터 시작하도록 하였다
 *       (743 => 7430, 7431, 7432)
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

#define endl '\n'

// Set up : Global Variables
#define MAX 9876543210

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;

    // Process
    vector<long> desc; /* 줄어드는 숫자가 저장될 Vector */
    queue<long> que;
    for (int i=0; i<=9; i++) { /* Queue 초기화 */
        desc.push_back(i);
        que.push(i);
    }

    while (not(que.empty())) {
        long c = que.front(); que.pop();

        /* 0 부터 c 의 일의자리 숫자의 값-1 까지 차례로 뒤에 붙임 */
        for (int i=0; i<c%10; i++) {
            long n = 10*c + i;
            desc.push_back(n);
            que.push(n);
        }
    }

    // Control : Output
    cout << ((N > desc.size()) ? -1 : desc[N-1]) << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글