18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
좌표 압축 문제는 테크닉은 어렵지 않지만 더 어려운 문제에서 활용되어 쓰인다고 한다.
처음에는 pair를 사용해서 인덱스와 값을 입력받고 정렬 후 O(N)으로 처리하려 했는데 잘 안돼서 찾아보니
unique와 lower_bound를 사용해서 해결하는 문제였다.
우선 배열 2개를 선언해서 같은 값을 받아준다.
vector<int> ar(n), ans(n);
for (int i = 0; i < n; i++) {
cin >> ar[i]; ans[i] = ar[i];
}
이 후에 정렬을 하고 중복을 제거해주면 이런 상태가 된다.
2 4 -10 4 -9
-10 -9 2 4
이 상태에서 lower_bound를 통해 인덱스를 구해주면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n;
cin >> n;
vector<int> ar(n), ans(n);
for (int i = 0; i < n; i++) {
cin >> ar[i]; ans[i] = ar[i];
}
sort(ans.begin(), ans.end());
auto it = unique(ans.begin(), ans.end());
for (int i = 0; i < n; i++)
cout << lower_bound(ans.begin(), it, ar[i]) - ans.begin() << ' ';
return 0;
}
해답을 안 봤으면 못 떠올렸을 것 같은 문제였다..
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 2015 수들의 합 4 (0) | 2020.09.23 |
---|---|
BOJ 팰린드롬? (0) | 2020.09.22 |
BOJ 1747 소수&팰린드롬 (0) | 2020.09.21 |
백준 2086 피보나치 수의 합 (0) | 2020.09.20 |
BOJ 11778 피보나치 수와 최대공약수 (0) | 2020.09.19 |