• toc {:toc}

๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

1039: ๊ตํ™˜ ๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

์—ฐ์‚ฐ ์ž์ฒด๋Š” i์™€ j๋ฅผ ๊ณจ๋ผ swapํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ์ด๋‹ค. ๋‹ค์Œ์˜ ์—ฐ์‚ฐ์„ K๋ฒˆ ์ง„ํ–‰ํ•˜์—ฌ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด๋•Œ, ์ง‘์ค‘ํ•ด์„œ ๋ด์•ผํ•  ์ ์€ K๋ฒˆ์„ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ๋ถ€๋ถ„์ด๋‹ค.

  • ์ฃผ์–ด์ง„ ์—ฐ์‚ฐ์„ K๋ฒˆ ํ–ˆ์„ ๋•Œ, ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜
    1. 1~K๋ฒˆ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ ์ค‘ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜
    2. K๋ฒˆ์งธ ์—ฐ์‚ฐ์„ ํ–ˆ์„ ๋•Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜

๋‹ค์Œ 1, 2๋ฒˆ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ• ๊นŒ? ํ•ด๋‹น ๋ฌธ์ œ๋Š” 2๋ฒˆ์„ ์˜๋ฏธํ•œ๋‹ค. ๋•Œ๋ฌธ์— K๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ๋ฐ˜๋“œ์‹œ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ level์„ ํ†ตํ•ด ํ•ด๋‹น ๊ณ„์‚ฐ์ด ๋ช‡ ๋ฒˆ ์—ฐ์‚ฐ๋๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ์— BFS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•œ๋‹ค. ์ดํ›„ K๋ฒˆ ์—ฐ์‚ฐํ•œ ๊ฒƒ์„ ๋”ฐ๋กœ max_q์— ์ €์žฅํ•ด๋†“๊ณ  max_q์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

#include <bits/stdc++.h>
using namespace std;
 
int depth[1000001];
int visit[1000001] = {};
string N;
int res = 0, K, level=0;
queue<pair<string, int>> q;
queue<int> max_q;
 
string Swap(string str, int i, int j){
    char temp;
    temp = str[i];
    str[i] = str[j];
    str[j] = temp;
    return str;
}
 
 
void bfs(){
    int stage = 0;
    while(q.empty()==0){
        string str = q.front().first;
        level = q.front().second;
        if (stage != level) {
            stage = level;
            fill(visit, visit+1000001, 0);
        }
        if (level == K) {
            max_q.push(stoi(str));
            q.pop();
            continue;
        }
 
        for(int i=0; i<N.size()-1; i++){
            for(int j=i+1; j<N.size(); j++){
                string change = str;
                if(i==0 && str[j] == '0') continue;
                change = Swap(str, i, j);
 
                int val = stoi(change);
                // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ
                if (!visit[val]){
                    visit[val] = 1;
                    q.push({change, level+1});
                }                 
            }
        }
        q.pop();
    }
}
 
int main(){
    ios::sync_with_stdio(true);
    cin.tie(0); cout.tie(0);
    
    cin >> N >> K;
 
    q.push({N, 0});
 
    if (K==0){
        cout << N << endl;
        exit(0);
    }
    else if (N.size() == 1 || (N.size() == 2 && stoi(N) % 10 == 0)){
        cout << -1 << endl;
        exit(0);
    }
 
    bfs();
 
    while(!max_q.empty()){
        if(res < max_q.front()){
            res = max_q.front();
        }
        max_q.pop();
    }
 
    cout << res << endl;
 
 
    return 0;
}

์ฐธ๊ณ ๋ฌธํ—Œ

์—ฐ๊ฒฐ๋ฌธ์„œ