문제

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

걸린 시간

00 : 50 : 30

풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
typedef long long ll;
using namespace std;

int n;
vector<pair<string, int>> key1;
vector<string> key2, crypto, decrypto;

void binsearch(int after){
    int mid;
    int left = 0;
    int right = n-1;
    while(left <= right){
        mid = (left+right)/2;
        if(key2[after] == key1[mid].first)
            break;
        else if(key2[after] < key1[mid].first)
            right = mid - 1;
        else
            left = mid + 1;
    }
    int before = key1[mid].second;
    decrypto[before] = crypto[after];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        cin >> n;
        key1.resize(n); key2.resize(n);
        crypto.resize(n); decrypto.resize(n);
        string key;
        for(int i = 0; i < n; i++){
            cin >> key;
            key1[i].first = key;
            key1[i].second = i;
        }
        for(auto& i : key2) cin >> i;
        for(auto& i : crypto) cin >> i;
        sort(key1.begin(), key1.end());
        for(int i = 0; i < n; i++)
            binsearch(i);
        for(int i = 0; i < n; i++)
            cout << decrypto[i] << " ";
        cout << "\n";
    }
    return 0;
}

2중 for문으로 공개키 1, 2를 일일이 모두 비교해 어떻게 재배치되었는지 확인하는 방법은 O(n2t) 로 비교 연산만 1억번이기 때문에 시간초과가 난다. 탐색의 시간을 줄이기 위해 이분 탐색을 사용했고 비교 연산이 nlogn 으로 줄어들어 제한시간 1초안에 통과할 수 있었다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 2174번 로봇 시뮬레이션  (0) 2020.09.21
Baekjoon 1339번 단어 수학  (0) 2020.09.18
Baekjoon 17877번 Integer Division  (0) 2020.09.16
Baekjoon 17827번 달팽이 리스트  (0) 2020.09.16
Baekjoon 11562번 백양로 브레이크  (0) 2020.09.14

댓글