문제를 풀기 앞서 좌표압축이 무엇인지부터 알아야 한다. 좌표압축이란 범위가 광범위한 좌표들이 존재할 때 임시적으로 index값을 매겨 새로운 압축된 좌표를 만드는 것이다.
좌표압축의 처리과정은 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 오름차순 정리(중복 제거)
// 좌표 압축 인덱스 부여
// 기존 배열과 비교 후 인덱스 값 입력
// index : 압축좌표 k : 기존 좌표 begin : 압축좌표의 앞단 end : 압축 좌표의 뒷단
int BinarySearch(vector<int> &index, int k, int begin, int end)
{
if(begin > end) return - 1;
int m = (begin + end) / 2;
if(index[m] == k) return m;
else if(index[m] > k) return BinarySearch(index, k, begin, m-1);
else return BinarySearch(index, k, m+1, end);
}
int main()
{
int num, temp;
vector<int> index;
vector<int> x_list;
// 값 입력
scanf("%d", &num);
for(int i=0; i < num; i++)
{
scanf("%d", &temp);
index.push_back(temp);
x_list.push_back(temp);
}
// 오름차순 정렬
sort(index.begin(), index.end());
// 중복제거
index.erase(unique(index.begin(), index.end()), index.end());
// index 부여
for(int i=0; i < x_list.size(); i++)
x_list[i] = BinarySearch(index, x_list[i], 0, index.size());
for(auto el : x_list)
printf("%d ", el);
printf("\n");
}
int BinarySearch(vector<int> &index, int k, int begin, int end)
{
if(begin > end) return - 1;
int m = (begin + end) / 2;
if(index[m] == k) return m;
else if(index[m] > k) return BinarySearch(index, k, begin, m-1);
else return BinarySearch(index, k, m+1, end);
}
for(int i=0; i < x_list.size(); i++)
x_list[i] = BinarySearch(index, x_list[i], 0, index.size());
과정은 위에 구현해둔 코드와 같으나 이진탐색을 라이브러리로 구현해 둔 lower_bound
를 사용하여 구현 하였다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 오름차순 정리(중복 제거)
// 좌표 압축 인덱스 부여
// 기존 배열과 비교 후 인덱스 값 입력
// index : 압축좌표 k : 기존 좌표 begin : 압축좌표의 앞단 end : 압축 좌표의 뒷단
int main()
{
int num, temp;
vector<int> index;
vector<int> x_list;
// 값 입력
scanf("%d", &num);
for(int i=0; i < num; i++)
{
scanf("%d", &temp);
index.push_back(temp);
x_list.push_back(temp);
}
// 오름차순 정렬
sort(index.begin(), index.end());
// 중복제거
index.erase(unique(index.begin(), index.end()), index.end());
// index 부여
for(int i=0; i < x_list.size(); i++)
printf("%ld ", (lower_bound(index.begin(), index.end(), x_list[i]) - index.begin()));
}