PS/Algorithm
좌표 압축
hyelie
2022. 6. 28. 19:44
값의 대소 관계만 필요하다면 수를 바꾸어 사용할 수 있다.
예를 들어 [0, 1, 5, 6, 11] 이런 좌표라면 [0, 1, 2, 3, 4]로 바꿀 수 있고, [0, 100, 150, 50, 175, 50, 50] 이런 좌표라면 [0, 2, 3, 1, 4, 1, 1]로 바꿀 수 있다.
방법은 크게 2가지가 있다.
- vector의 unique 값을 지우고 lower_bound로 해당 값을 찾는 방법
- set으로 중복을 지우고 map으로 압축된 좌표를 mapping하는 방법
1. vector의 unique 값을 지우고 lower_bound로 찾는 방법 : O(nlogn)
void gridCompress(vector<int> &arr){
vector<int> temp(arr.size());
for(int i = 0; i<arr.size(); i++){
temp[i] = arr[i];
}
sort(temp.begin(), temp.end());
temp.erase(unique(temp.begin(), temp.end()), temp.end());
for(int i = 0; i<arr.size(); i++){
arr[i] = lower_bound(temp.begin(), temp.end(), arr[i]) - temp.begin();
}
}
2. set으로 중복을 지우고 map으로 값을 mapping하는 방법 : O(nlogn)
void gridCompress(vector<int> &arr){
set<int> temp;
for(int i = 0; i<arr.size(); i++){
temp.insert(arr[i]);
}
int i = 0;
map<int, int> mapper;
for(int elem : temp){
mapper[elem] = i++;
}
for(int i = 0; i<arr.size(); i++){
arr[i] = mapper[arr[i]];
}
}
기억만 해 두고, 그때그때 좋은 것을 사용하자. 그러나 기본적으로는 위의 것이 더 빠르다!