본문 바로가기
PS/Baekjoon

[백준/C++] 18870번: 좌표 압축(S2)

by 이지이즤 2022. 1. 11.
728x90

문제

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

 

18870번: 좌표 압축

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

www.acmicpc.net

 

사용한 알고리즘

2022.01.11 - [PS/Algorithm] - [알고리즘 개념정리] 1. 정렬 (sort STL), 특정 변수 기준으로 정렬하기

-> 비교함수 정의하기

 

풀이

  1. idx, X, X'을 변수로 가지는 구조체 Point와 구조체 배열 생성
  2. idx에 인덱스 입력, X를 입력받음
  3. X를 기준으로 오름차순 정렬
  4. 나의 왼쪽에 있는 원소중에 나보다 크기가 작은 원소의 개수를 변수X'에 저장
  5. idx를 기준으로 오름차순 정렬
  6. X'출력

 

소스코드

#include <iostream>
#include <algorithm>
using namespace std;
//비교함수 정의

// 1. idx, X, X'을 변수로 가지는 구조체 Point와 구조체 배열 생성
struct Point{
    int idx; //인덱스
    int x; //입력(X)
    int y; //출력(X')
}p[1000001];

bool cmp1(const Point &a, const Point &b){
    return a.x<b.x;
}
bool cmp2(Point &a, Point &b){
    return a.idx<b.idx;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int n; cin>>n;
    
    // 2. idx에 인덱스 입력, X를 입력받음
    for(int i=0; i<n; i++){
        p[i].idx=i;
        cin>>p[i].x;
    }
    
    // 3. X를 기준으로 오름차순 정렬
    sort(p,p+n,cmp1); 
    
    // 4. 나의 왼쪽에 있는 원소중에 나보다 크기가 작은 원소의 개수를 변수X'에 저장
    p[0].y=0;
    for(int i=1,j=0; i<n; i++){
        if(p[i].x>p[i-1].x) j++;
        p[i].y=j;
    }
    
    // 5. idx를 기준으로 오름차순 정렬
    sort(p,p+n,cmp2);
    
    // 6. X'출력
    for(int i=0; i<n; i++){
        cout<<p[i].y<<" ";
    }
    return 0;
}
728x90

'PS > Baekjoon' 카테고리의 다른 글

[백준/C++] 5525번: IOIOI(S2)  (2) 2022.01.16
[백준/C++] 2437번: 저울(G3)  (0) 2022.01.14
[백준/C++] 9009번: 피보나치(S1)  (0) 2022.01.14
[백준/C++] 1431번: 시리얼번호(S3)  (0) 2022.01.12
[백준] 맞왜틀 체크리스트  (0) 2022.01.11

댓글