[백준/C++] 18870번 좌표 압축

2021. 2. 26. 22:28알고리즘/구현

728x90
반응형

문제: www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

 

 

문제풀이

 

입력되는 좌표 Xn에 대하여 Xn 보다 작은 좌표의 수를 각각 출력해주는 문제이다.

 

좌표의 개수는 1000,000으로 1000,001 크기의 벡터를 선언하여 벡터의 인덱스를 이용해 문제를 풀었다.

 

pair 벡터를 선언해 {좌표, 순서} 순으로 저장하고 좌표를 기준으로 오름차순 정렬했다.

이후 벡터를 탐색해 좌표 크기 순서대로 정답 벡터에 압축한 좌표의 수를 저장하고

정답 벡터를 출력했다.

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);

    int N;
    cin>>N;

    vector<pair<int ,int>> v;
    vector<int> rv(1000001);
    for(int i=0; i<N; i++){
        int x;
        cin>>x;
        v.push_back({x, i});
    }

    sort(v.begin(), v.end());

    int pre = v[0].first;
    int cnt = 0;
    for(int i=0; i<N; i++){
        if(pre != v[i].first){
            rv[v[i].second] = ++cnt;
            pre = v[i].first;
        }
        else{
            rv[v[i].second] = cnt;
        }
    }

    for(int i=0; i<N; i++){
        cout<<rv[i]<<" ";

    }

    return 0;
}

 

 

결과

 

728x90
반응형

'알고리즘 > 구현' 카테고리의 다른 글

[백준/C++] 5397번 키로거  (0) 2021.03.19
[백준/C++] 1927번 최소 힙  (0) 2021.03.11
[백준/C++] 11279번 최대 힙  (0) 2021.02.25
[백준/C++] 5525번 IOIOI  (0) 2021.02.25
[백준/C++] 1780번 종이의 개수  (0) 2021.02.23