www.acmicpc.net/problem/18870

 

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

+ Recent posts