18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin >> n;
vector<int> data(n); // 실제 데이터들 그대로 담을 배열
vector<int> answer(n); // 좌표 압축할 배열
for(int i = 0 ; i < n ; i++)
{
cin >> data[i];
answer[i] = data[i];
}
sort(answer.begin(), answer.end()); // 우선 오름차순 정렬을 해준 뒤
answer.erase(unique(answer.begin(), answer.end()), answer.end()); // 중복되는 값들을 제거해주면 인덱싱 성공
for(int i = 0 ; i < n ; i++)
{
cout << int(lower_bound(answer.begin(), answer.end(), data[i]) - answer.begin()) << " "; // 인덱싱된 값 출력
}
cout << '\n';
}
[Approach]
1. N 이 백만이니까 시간복잡도를 잘 따져야 될 것 같다. DP 배열 사용이 가능할까?
-> 좌표 압축 기법에 대해서 찾아보았음
[Point]
1. 범위가 클 때 해당 범위를 필요한 만큼만으로 줄여서 사용하기. 순서가 중요할 때
2. unique 동작 원리 + erase 랑 같이 사용해서 중복 제거하기
3. 전에도 배웠던 lower_bound 를 통해 벡터에서 값 찾기
'PS > BOJ' 카테고리의 다른 글
[백준] 1074.cpp : Z (0) | 2020.07.04 |
---|---|
[백준] 5525.cpp : IOIOI (0) | 2020.07.04 |
[백준] 11279.cpp : 최대 힙 (0) | 2020.07.03 |
[백준] 5430.cpp : AC (0) | 2020.07.03 |
[백준] 1780.cpp : 종이의 개수 (0) | 2020.07.03 |