< [C++/백준 18870번] 좌표 압축

프로그래밍 공부/백준 (C++)

[C++/백준 18870번] 좌표 압축

Rocketbabydolls 2023. 8. 8. 21:19

 

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

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에

www.acmicpc.net

 

해결 방법

  1. 벡터에 값을 저장 한 후 정렬
  2. 정렬한 뒤 unique 를 이용해 중복 제거
  3. unordered map 에 중복 제거하고 정렬 된 키를 value 와 맞게 대입
  4. 본래 배열 순서대로 출력

주안점

   unordered_map 은 key:value 를 순서대로 저장하지 않으므로 탐색할 때 시간 복잡도는 1 이다.  그냥 map 은 key 를 기준으로 sorting 되어 있어 더 오래 걸릴 수 있다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <climits>
using namespace std;

int main() {
    int N;
    cin >> N;

    vector<int> arr(N);

    for (int i = 0; i < N; i++)
    {
        cin >> arr[i];
    }

    vector<int> sortedArr = arr;

    sort(sortedArr.begin(), sortedArr.end());

    sortedArr.erase(unique(sortedArr.begin(), sortedArr.end()), sortedArr.end());

    unordered_map<int, int> compressed;

    for (int i = 0; i < sortedArr.size(); i++)
    {
        compressed[sortedArr[i]] = i;
    }

    for (int i = 0; i < N; i++)
    {
        cout << compressed[arr[i]] << " ";
    }

    for (const auto& entry : compressed) {
        std::cout << "Key: " << entry.first << ", Value: " << entry.second << std::endl;
    }


    return 0;
}