본문 바로가기
알고리즘 문제풀이/백준

[백준 18870] 좌표 압축

by m2162003 2021. 2. 2.

www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

이걸 대체 어케 아는걸까...

 

인덱스와 값을 사용해서 푸는 문제이다.

정렬까진 알았는데 어떻게 활용해야 할지는 답을 봤다ㅠㅠ

 

로직은 다음과 같다.

값을 기준으로 오름차순 정렬된 배열을 돌면서 그 값의 인덱스에 해당하는 배열에 cnt값을 넣는다.

1. 인덱스와 값을 저장

2. 값을 기준으로 오름차순 정렬

3. 배열을 순회하며 해당 인덱스에 cnt값을 집어 넣는다.

3-1. 이때 cnt는 값이 달라질 때마다 ++되므로 값보다 작은 숫자의 개수라고 할 수 있다.

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

using namespace std;
int n;
vector<pair<int, int>> v;
vector<int> ans(1000001);
int main(void)
{
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);

  cin >> n;

  for (int i = 0; i < n; i++)
  {
    int x;
    cin >> x;
    v.push_back({x, i});
  }

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

  int cmp = v[0].first;
  int cnt = 0;
  ans[v[0].second] = 0;

  for (int i = 1; i < n; i++)
  {
    if (cmp == v[i].first)
    {
      ans[v[i].second] = cnt;
    }
    else
    {
      ans[v[i].second] = ++cnt;
      cmp = v[i].first;
    }
  }

  for (int i = 0; i < n; i++)
  {
    cout << ans[i] << " ";
  }

  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 11723] 집합  (0) 2021.02.06
[백준 10971] 외판원 순회2  (0) 2021.02.05
[백준 14170] Counting Haybales  (0) 2021.02.01
[백준 1790] 수 이어쓰기2  (0) 2021.02.01
[백준 9205] 맥주 마시면서 걸어가기  (0) 2021.01.31

댓글