[C++] 백준(BOJ) - 18870번 좌표 압축

2022. 2. 21. 18:00

풀이 코드

배열 a,b를 만들어 숫자들을 저장한 다음, 배열 a를 오름차순 정렬한다.

그 다음, map을 이용하여 압축된 코드를 저장한다.

map의 find 함수를 사용하면 찾고자 하는 값의 iterator을 가져오고,

만일 찾고자 하는 값이 없다면 map.end()을 반환한다. 

map을 순회하면서 a[i]가 있다면 k값을 할당하고, 없다면 ++k 값을 할당한다.

출력은 배열 b를 이용하여 map을 순회하면서 한다.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define num 1000001
map<int,int> m;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n=0;int a[num]={0}; int b[num]={0}; int k=0;
    cin >> n;
    for(int i=0;i<n;i++){
        cin >>a[i];
        b[i]=a[i];
    }
  sort(a,a+n);
  for(int i=0;i<n;i++) {
    if(m.find(a[i])==m.end()){
      m[a[i]] = ++k;
      }
    else{
      m[a[i]] = k;
    }
  }
    for(int i=0;i<n;i++){
      cout<<m[b[i]]-1;
      cout<<' ';
    } 
  cout<<'\n';
  return 0;
}

문제

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

 

18870번: 좌표 압축

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

www.acmicpc.net

 

BELATED ARTICLES

more