λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 1038번 - κ°μ†Œν•˜λŠ” 수

by μ•ˆμ£Όν˜• 2022. 9. 27.

문제

 

1038번: κ°μ†Œν•˜λŠ” 수

음이 μ•„λ‹Œ μ •μˆ˜ X의 μžλ¦Ώμˆ˜κ°€ κ°€μž₯ 큰 μžλ¦Ώμˆ˜λΆ€ν„° μž‘μ€ μžλ¦Ώμˆ˜κΉŒμ§€ κ°μ†Œν•œλ‹€λ©΄, κ·Έ 수λ₯Ό κ°μ†Œν•˜λŠ” 수라고 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 321κ³Ό 950은 κ°μ†Œν•˜λŠ” μˆ˜μ§€λ§Œ, 322와 958은 μ•„λ‹ˆλ‹€. N번째 κ°μ†Œν•˜λŠ” 수λ₯Ό

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;


vector<ll> v;

void backtracking(string s){
    if(s > "9876543210") return;
    string temp = s;
    reverse(temp.begin(), temp.end());
    v.push_back(stoll(temp));
    for(int i=s.back() - '0' + 1; i<=9; i++){
        string num = to_string(i);
        backtracking(s + num);
    }
    
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int n; cin>>n;
    for(int i=0; i<=9; i++){
        string num = to_string(i);
        backtracking(num);
    }
    sort(v.begin(), v.end());
    
    if(n>=v.size()) cout<<-1;
    else cout<<v[n];
}

 

풀이

  1. 0, 01, 012, 0123...., 0123456789, 012345679, 01234568, 012345689 ... 순으둜 μ¦κ°€ν•˜λŠ” 순으둜 backtracking을 νƒμƒ‰ν•©λ‹ˆλ‹€.
  2. μœ„ numberλ₯Ό 거꾸둜 즉 μ—­μˆœμœΌλ‘œ λ°”κΎΈλ©΄ κ°μ†Œν•˜λŠ” μˆ˜κ°€ λ˜κΈ°μ— reverse μ‹œμΌœμ„œ vector에 μ €μž₯ν•©λ‹ˆλ‹€.
  3. κ°€μž₯ 큰 κ°μ†Œν•˜λŠ” μˆ˜λŠ” 9876543210 으둜 int값을 λ„˜κΈ° λ•Œλ¬Έμ— long long으둜 vectorλ₯Ό μ„ μ–Έν•΄μ€λ‹ˆλ‹€.
  4. λ§ˆμ§€λ§‰μ— μ •λ ¬ ν›„ 찾고자 ν•˜λŠ” N을 V[N]으둜 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.

총 v[0] = 0, .... v[1022] = 9876543210이 λ©λ‹ˆλ‹€.

λŒ“κΈ€