문제풀이/백준oj

[백준OJ] 좌표 압축

Hyeon-Uk 2021. 3. 28. 23:58
반응형

www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net


 

-풀이-

먼저 입력받은 값들을 a와 b 모두 저장해준다음에, b를 정렬하고 중복값을 제거해준다.

그러면 중복값이 없는 오름차순 배열이 완성될텐데, 이 b벡터를 돌며 map에 순위를 저장시킨다.

마지막으로 a벡터를 돌며 해당 값에 따른 순위를 map에서 꺼내온다.

 

-시간복잡도-

정렬은 퀵소트를 사용했으므로 O(NlogN) 이되고, erase함수가 O(N) , unique함수가 O(N)이므로, 중복을 제거하는 로직은 O(N+N)=O(N)이 된다.

따라서 총 O(NlogN)이된다.

 

-코드-

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;

int n;
vector<int> a, b;
map<int,int> m;

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		int data;
		cin >> data;
		a.push_back(data);
		b.push_back(data);
	}

	sort(b.begin(), b.end());
	b.erase(unique(b.begin(), b.end()), b.end());
	for (int i = 0; i < b.size(); i++) {
		m[b[i]] = i;
	}
	for (int i = 0; i < n; i++) {
		cout << m[a[i]] << " ";
	}
}
반응형