CodingTest/백준

백준 18870 - 좌표 압축(C++)

빵아찌 2022. 6. 2. 15:41

문제를 읽고 vector를 2개를 두고

정렬한 후에 unique로 제외하여 lower_bound를 사용하여

풀이가 가능할 것 같았지만 괜히 unique를 안쓰고 싶어져서 코드가 더럽다.

 

 

#include <iostream>
#include <vector>
#include <map>
using namespace std;
int iN = 0;

int main()
{
	cin >> iN;
	vector<int> vUnorder;
	map<int, vector<int>> map_Order;
	vUnorder.reserve(iN);
	int iTemp = 0;
	for (int i = 0; i < iN; i++)
	{
		cin >> iTemp;
		vUnorder.emplace_back(iTemp);
		if (map_Order.find(iTemp) != map_Order.end())
			map_Order.find(iTemp)->second.emplace_back(i);
		else
			map_Order.emplace(iTemp, vector<int>(1, i));
	}
	auto iter_map = map_Order.begin();
	for (int i = 0; i < map_Order.size(); i++)
	{
		int iNum = iter_map->first;
		for (int j = 0; j < map_Order[iNum].size(); j++)
			vUnorder[map_Order[iNum][j]] = i;
		iter_map++;
	}
	for (int i = 0; i < iN; i++)
		cout << vUnorder[i] << " ";
	cout << "\n";
	return 0;
}

 

map을 사용하여 중복을 제거하고 물론 옳은 방법은 아닌거 같다

map의 key를 사용하여 정렬된 순서로 0부터 순차적으로 압축한 값을 출력하였다.