https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> v;
vector<int> copy;
int temp;
for (int i = 0; i < n; i++)
{
cin >> temp;
v.push_back(temp);
copy.push_back(temp);
}
sort(copy.begin(), copy.end());
copy.erase(unique(copy.begin(), copy.end()), copy.end());
for (int i = 0; i < n; i++)
{
cout << lower_bound(copy.begin(), copy.end(), v[i]) - copy.begin() << ' ';
}
return 0;
}
중복되는 값은 세지 않아야하기 때문에, vector에서 중복된 값들을 지워줘야한다.
이를 해결하기 위해, erase() 와 unique()메소드를 활용했다.
unique() 메소드의 경우, 시작지점과 끝지점을 주면, vector의 끝부분으로 그 값들을 뒤로 옮겨주고
erase 기능을 활용해서, 해당 지점들을 삭제해주었다.
그리고 lower_bound를 활용한 이유는, 단순히 이중 for문을 활용하면 시간 복잡도로 인해서
시간 초과가 된다.
'백준 문제풀이 > 실버2' 카테고리의 다른 글
백준 2004번 - 조합 0의 개수 (0) | 2022.08.03 |
---|---|
백준 1874번 - 스택 수열 (0) | 2022.06.24 |
백준 9020번 - 골드바흐의 추측 (0) | 2022.06.07 |