풀이
1. 벡터 입력 받고 원본 벡터(x)를 복사한 다른 벡터(solve)를 만든다
2. 복사한 벡터를 오름차순으로 정렬하고, erase, unique 함수를 사용하여 중복값을 제거한다
3. lower_bound 함수를 사용하여 2번 처리한 벡터에서 x[i] 값들이 몇번째에 위치하는지 확인한다
4. lower_bound 함수는 주소값을 반환하므로, 2번 처리한 벡터 solve의 시작 주소값을 빼서 출력
C++ erase, unique, lower_bound
1. erase: 말 그대로 벡터의 값을 지움
2. unique: 중복되지 않는 원소들을 앞에서부터 채워나가는 역할. 따라서 남은 뒷부분은 그대로 vector 원소값이 존재한다.
=> 두 함수를 함께 사용하면 중복값을 지울 수 있다.
3. lower_bound: Returns an iterator pointing to the first element in the container which is not considered to go before val. 원소가 저장된 공간 주소의 시작값을 반환한다.
정답 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int main(void) {
cin >> n;
vector<int> x(n);
for (int i = 0; i < n; i++) {
cin >> x[i];
}
vector<int> solve(x); // 원본 벡터 복사
// 벡터 복사되는 부분 확인
/*
* for (int i = 0; i < solve.size(); i++) {
cout << solve[i] << ' ';
}
cout << '\n';
*/
sort(solve.begin(), solve.end()); // 오름차순 정렬
solve.erase(unique(solve.begin(), solve.end()), solve.end()); // 중복값 제거
for (int i = 0; i < n; i++) {
// 원본 벡터 x의 i번째 원소가
// 복사본 solve에서 몇번째에 위치하는지 확인한다
// lower_bound는 주소값을 반환한다
auto it = lower_bound(solve.begin(), solve.end(), x[i]);
// lower_bound의 반환값에 solve의 시작 주소값을 빼면 답이 된다
cout << it - solve.begin() << ' ';
}
return 0;
}
'자료구조, 알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[백준 14425] 문자열 집합 C++ (0) | 2022.08.03 |
---|---|
[백준 2606] 바이러스 (0) | 2022.06.21 |
[백준] 6588 골드바흐의 추측 (0) | 2022.04.02 |
[백준] 1406 에디터 (0) | 2022.03.06 |
[백준 4375] 모듈로 연산이란? (0) | 2022.02.16 |