-
반응형
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]] << " "; } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 16236번 아기상어 (0) 2021.04.12 [백준OJ] 14500번 테트로미노 (0) 2021.03.29 [백준OJ] 8983번 사냥꾼 (0) 2021.03.27 [백준OJ] 8012번 한동이는 영업사원! (0) 2021.03.24 [백준OJ] 14002번 가장 긴 증가하는 부분 수열 4 , 14003번 가장 긴 증가하는 부분 수열 5 (0) 2021.03.22 댓글