본문 바로가기
알고리즘

백준 s2 18870 좌표 압축 c++

by kyj0032 2024. 2. 15.

https://www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

 

문제

X_i` = X_i보다 작은, 중복되지 않은, 다른 원소의 개수

 

풀이

배열을 두 번씩 돌리면서 각각 X_j의 개수를 세는 방법도 있지만 N <= 10^6이므로, 시간초과가 난다. O(n^2)

 

X_i보다 작은 원소의 개수이므로, 정렬 후 이분 탐색의 lower_bound를 이용하여 index의 차이를 구하는 방법을 생각할 수 있다. -> O(NlogN)

 

코드

 

/*boj s2 18870 좌표 압축*/
#include <algorithm>
#include <iostream>
#include <vector>
#define MAXN 1000010
using namespace std;

int N;
int input[MAXN];
vector<int> arr;
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> input[i];
        arr.push_back(input[i]);
    }
    sort(arr.begin(), arr.end());
    arr.erase(unique(arr.begin(), arr.end()), arr.end());

    for (int i = 0; i < N; i++) {
        cout << lower_bound(arr.begin(), arr.end(), input[i]) - arr.begin() << " ";
    }
}

'알고리즘' 카테고리의 다른 글

백준 s2 1654 랜선 자르기 c++  (0) 2024.02.16
백준 g4 2295 세 수의 합 c++  (0) 2024.02.16
백준 s2 11501 주식 c++  (0) 2024.01.26
백준 g5 2170 선 긋기 c++  (0) 2024.01.26
백준 s2 1541 잃어버린 괄호 c++  (0) 2024.01.25