https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
[난이도] Silver2
[유형] 좌표압축
[풀이]
나올 수 있는 수자의 범위는 -10^9 ~ 10^9이지만 실제 숫자의 개수는 10^6 최대이므로
0~(10^6)-1 로 압축이 가능합니다.
정렬을 한 뒤, map을 이용하였습니다.
작은 수부터 순회하면서 숫자가 이미 map에 저장되어 있다면 이전 수와 동일한 수이므로
mp[a[i]] = k 로 저장해주고, map에 저장되어 있지 않다면 처음 등장하는 수이므로 mp[a[i]] = ++k와 같이
저장해줍니다.
그 뒤 정렬하지 않은 original 배열인 b를 순회하면서
mp[b[i]]를 출력하면 압축된 좌표로 출력이 됩니다.
#include <cstdio> #include <map> #include <algorithm> using namespace std; const int mxN = 1e6+1; int n,a[mxN],b[mxN],k; map<int,int> mp; int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(a,a+n); for(int i=0;i<n;i++) mp[a[i]]= mp.find(a[i])==mp.end() ? ++k : k; for(int i=0;i<n;i++) printf("%d ",mp[b[i]]-1); }
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Silver2/18870.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Silver3] 15650 : N과 M (2) (Kotlin) (0) | 2021.08.06 |
---|---|
[BOJ/백준][Silver2] 11279 : 최대 힙 (Kotlin) (0) | 2021.08.06 |
[BOJ/백준][Silver5] 17626 : Four Squares (C++) (0) | 2021.07.25 |
[BOJ/백준][Silver4] 17219 : 비밀번호 찾기 (Kotlin) (0) | 2021.07.25 |
[BOJ/백준][Silver1] 16928 : 뱀과 사다리 게임 (C++) (0) | 2021.07.25 |