Baekjoon

Baekjoon 1039번 교환

ppwag 2020. 11. 19. 10:05

문제

https://www.acmicpc.net/problem/1039

걸린 시간

01 : 07 : 17

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

string N;
int K;
map<pair<string, int>, int> visited; // key : n, k

int bfs(){
    queue<string> q;
    q.push(N);
    int ans = -1;
    int depth = -1;
    while(!q.empty()){
        depth++;
        int size = q.size();
        for(int c = 0; c < size; c++){
            string here = q.front();
            q.pop();
            if(depth == K){
                ans = max(ans, stoi(here));
                continue;
            }
            for(int i = 0; i < N.size(); i++){
                for(int j = i+1; j < N.size(); j++){
                    string next = here;
                    char tmp = next[i];
                    next[i] = next[j];
                    next[j] = tmp;
                    if(next[0] == '0') continue;
                    if(visited[make_pair(next, depth)] != 0) continue;
                    visited[make_pair(next, depth)] = 1;
                    q.push(next);
                }
            }
        }
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> K;
    cout << bfs(); 
    return 0;
}

완전탐색으로 정답을 구해본 후 어떻게 최적화를 시킬지 고민하다 바꾼 숫자의 인덱스 i, j 와 지금까지 바꾼 횟수 k 값으로 메모이제이션을 적용해 보았는데 생각이 너무 짧았던 것 같다.

분류를 보니 그래프 탐색 문제였다. 문자 두개를 바꾸는 작업을 방문 배열을 사용해서 중복되지 않게 k번 반복해야한다. bfs, dfs 원리는 모두 같으므로 둘 중 아무거나 사용하면 될 것 같다. visited 배열의 key 값이 조금 특이해서 골드 3 문제이지 않았나 싶다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 16954번 움직이는 미로 탈출  (0) 2020.11.22
Baekjoon 11066번 파일 합치기  (0) 2020.11.22
Baekjoon 4195번 친구 네트워크  (0) 2020.11.16
Baekjoon 1655번 가운데를 말해요  (0) 2020.11.13
Baekjoon 5213번 과외맨  (0) 2020.11.12

댓글