사용언어 : C++
문제풀이
* vector 이용!! (sort, erase, unique, lower_bound)
(1) 2개의 vector가 필요하다. original vector, check vector
original vector : 순서대로 좌표압축 값을 출력해야함
check vector : 좌표압축 값 계산할 때 사용
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
vector<int> check(v);
(2) check vector 변형해주기
중복되지 않는, 오름차순으로 정렬해주기.
=> 오름차순 정렬 후 중복된 값은 뒤로 보내준다. 중복된 값들은 다 지워준다. (중복 시작 된 곳부터 끝까지)
sort(check.begin(), check.end());
check.erase(unique(check.begin(), check.end()), check.end());
sort(v.begin(),v.end()); //오름차순 정렬
unique(v.begin(),v.end()); // 중복된 값은 뒤로 보내준다
ex) 1 3 4 2 2 5 3 1 => 1 3 4 2 5 2 3 1
erase(v.begin(),v.end()); //v.begin()~v.end()사이 원소값 지워주기
(3) check vector를 이용해 original vector 좌표압축 값 구하기
for (int i = 0; i < n; i++) {
cout<< lower_bound(check.begin(), check.end(), v[i]) - check.begin()<<" ";
}
lower_bound(arr,arr+n,key) // arr~arr+n 사이에 key의 위치 리턴해주기
// 리턴 타입이 iterator이기 때문에 몇 번째 인자인지 알기 위해선 v.begin()을 빼준다.
전체코드
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int main() {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
vector<int> check(v);
sort(check.begin(), check.end());
check.erase(unique(check.begin(), check.end()), check.end());
for (int i = 0; i < n; i++) {
cout<< lower_bound(check.begin(), check.end(), v[i]) - check.begin()<<" ";
}
}
총평
좀 어려웠다... 벡터 기능을 잘 활용해야 하는 문제!
문제 출처
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
'CodingTest > BOJ' 카테고리의 다른 글
[BOJ 1110] 백준 더하기 사이클 - C++ (0) | 2022.04.02 |
---|---|
[BOJ 2164] 백준 카드2 풀이 - C++ (0) | 2021.11.16 |
[BOJ 11047] 백준 동전0 풀이 - C++ (0) | 2021.11.14 |
[BOJ 20001] 백준 고무오리 디버깅 풀이 - C++ (0) | 2021.09.30 |
[BOJ 1699] 백준 제곱수의 합 풀이 - C++ (0) | 2021.09.30 |