프로그래밍 공부/백준 (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
해결 방법
- 벡터에 값을 저장 한 후 정렬
- 정렬한 뒤 unique 를 이용해 중복 제거
- unordered map 에 중복 제거하고 정렬 된 키를 value 와 맞게 대입
- 본래 배열 순서대로 출력
주안점
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;
}