🧩PS/🥈Nomal
[C/C++] 백준 18870번 - 좌표 압축
Cocoon_
2021. 7. 24. 23:56
반응형
<코드>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N, X, cnt = 0;
vector<pair<int, int>> v, ans;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> X;
v.push_back({ X,i }); // {Xi,기존순서}
}
sort(v.begin(), v.end());
ans.push_back({v[0].second, 0});
for (int i = 1; i < N; i++)
{
if (v[i-1].first == v[i].first)
{
ans.push_back({ v[i].second, cnt }); // {기존순서, Xi'}
}
else
{
ans.push_back({ v[i].second, ++cnt }); // {기존순서, Xi'}
}
}
sort(ans.begin(), ans.end());
for (int i = 0; i < N; i++)
cout << ans[i].second << " ";
}
풀이 방법
1. 입력받기(입력받은 순서가 order)
<v벡터>
Xi | order |
2 | 0 |
4 | 1 |
-10 | 2 |
4 | 3 |
-9 | 4 |
2. Xi의 크기대로 2차원 v벡터 정렬하기
<v벡터>
Xi | order |
-10 | 2 |
-9 | 4 |
2 | 0 |
4 | 1 |
4 | 3 |
3. 앞 뒤의 Xi값을 비교해서 같으면 cnt(카운트)를 그대로 유지하고 다르다면 ++cnt을 해줍니다.
<ans벡터>
order | Xi' |
2 | 0 |
4 | 1 |
0 | 2 |
1 | 3 |
3 | 3 |
v[0].first = -10이고 가장 처음의 값이므로 X0' = 0
v[1].first = -9이고 이전값(v[0].first = -10)과 다르므로 X1' = 1
v[2].first = 2이고 이전값(v[1].first = -9)과 다르므로 X2' = 2
v[3].first = 4이고 이전값(v[2].first = 2)과 다르므로 X3' = 3
v[4].first = 4이고 이전값(v[3].first = 4)과 같으므로 X4' = 3
4. ans 벡터를 다시 오름차순으로 정렬하고 정답 출력
<ans벡터>
order | Xi' |
0 | 2 |
1 | 3 |
2 | 0 |
3 | 3 |
4 | 1 |
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
반응형