정렬, 값 / 좌표 압축으로 알고리즘 분류가 되어있는 문제입니다. 문제를 다 풀고 다른 분들의 풀이를 보았는데 보통 vector의 lower_bound, unique 함수 두 가지를 이용한 풀이가 많았습니다. 저는 두 함수를 몰랐기 때문에 이상한 방법으로 풀었지만....내가 푼 방법을 정리하고, 위 함수들을 공부해보겠습니다!
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
int N, num;
vector<pair<int, int>> vec;
vector<pair<int, int>> result;
cin >> N;
for(int i = 0; i < N; i++){
cin >> num;
vec.push_back(pair<int, int>(num, i));
}
sort(vec.begin(), vec.end());
result.push_back(pair<int, int> (vec[0].second, 0));
int zip = 0;
for(int i = 1; i < N; i++){
if(vec[i-1].first != vec[i].first) zip++;
result.push_back(pair<int, int>(vec[i].second, zip));
}
sort(result.begin(), result.end());
for(auto r : result){
cout << r.second << " ";
}
return 0;
}