십진수가 있을 때 i번째 자리와 j번째 자리를 swap할 수 있다고 하자. 이 연산을 k번 했을 때 만들 수 있는 최고값을 묻는 문제다.


bfs로 풀었다. 다만 숫자중에 같은 숫자가 2개 이상 있다면 k번째일때만 검사하는게 아니라 모든 경우가 최대값이 될 수 있기 때문에


(위치가 다른 같은 숫자를 swap한다면 횟수는 소모되지만 수는 그대로다) 그 경우를 고려해야 하고 같은 숫자가 없다면


k와 짝수만큼 차이나는 횟수도 모두 정답일 수 있으므로 고려해야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
 
int rad(int x) {
    int ans = 0;
    while (x) {
        x /= 10;
        ans++;
    }
    return ans;
}
 
int t, n, k;
int d[1000001];
int p[7= { 1,10,100,1000,10000,100000,1000000 };
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> t;
    for (int tc = 1; tc <= t; ++tc) {
        int c[10= { 0, };
        memset(d, -1sizeof(d));
        cin >> n >> k;
        queue<int> q;
        int nrad = rad(n), ans = n, f = 0;
        for (int i = 0; i < nrad; ++i) {
            c[(n / p[i]) % 10]++;
            if (c[(n / p[i]) % 10== 2) f = 1;
        }
        q.push(n);
        d[n] = 0;
        while (q.size()) {
            int x = q.front();
            q.pop();
            if (d[x] == k) 
                break;
            for (int i = 0; i < nrad; ++i) {
                int x1 = (x / p[i]) % 10;
                for (int j = i + 1; j < nrad; ++j) {
                    int x2 = (x / p[j]) % 10;
                    int nx = x - x1 * (p[i] - p[j]) - x2 * (p[j] - p[i]);
                    if (d[nx] != -1continue;
                    d[nx] = d[x] + 1;
                    q.push(nx);
                    if (f) ans = max(ans, nx);
                    else if ((k - d[nx]) % 2 == 0)
                        ans = max(ans, nx);
                }
            }
        }
        cout << "#" << tc << " " << ans << '\n';
    }
    return 0;
}
cs


'SWEA' 카테고리의 다른 글

5653. 줄기세포 배양  (4) 2018.09.21
5216. 다항식의 계수  (0) 2018.09.04
1245. 균형점  (0) 2018.08.29
1247. 최적 경로  (0) 2018.08.29
1251. 하나로  (0) 2018.08.29

+ Recent posts