• 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;
}

μ°Έκ³ λ¬Έν—Œ

μ—°κ²°λ¬Έμ„œ