수의 범위가 매우 큰 상태에서 수의 값과 상관 없이 숫자 간의 대소관계만 알면 될 때 이용하는 알고리즘이다.
기본적으로 해당 알고리즘은 정렬, 이분 탐색을 이용한다.
vector<int> v; //별도의 배열 하나 선언
sort(v.begin(), v.end()); //오름차순 정렬
v.erase(unique(v.begin(), v.end()), v.end()); //중복 요소 제거
for(int i = 0; i < n; i++) {
//binary_search(v.begin(), v.end(), a[i]);
int idx= lower_bound(v.begin(), v.end(), a[i])-v.begin();
cout << idx << " ";
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int a[1000001];
vector<int> v;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
v.push_back(a[i]);
}
//오름차순 정렬
sort(v.begin(), v.end());
// 중복요소 제거
v.erase(unique(v.begin(), v.end()), v.end());
for(int i = 0; i < n; i++) {
int idx= lower_bound(v.begin(), v.end(), a[i])-v.begin();
cout << idx << " ";
}
}