https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
우선 문제부터 요약해보면,
주어진 좌표들 각각에 대해 총 좌표중 본인보다 작은 것들의 갯수를 출력해야 하는 문제입니다.
<Solution>
이 문제에서 생각 해야 하는 부분들은,
1. 중복된 값이 등장하는 경우에는 하나로 카운팅 해야한다
2. 숫자들이 총 1,000,000개 등장이 가능하기에, 매 숫자마다 전체를 탐색하면 시간초과가 된다
이렇게 두가지입니다.
그래서 이 두가지 점을 고려해서 문제 해결방법을 세워보면,
1. 중복을 제거하기 위해 set을 사용 2. set은 순서가 없으므로 vector로 변형 3. 해당 vector를 크기 순서대로 sorting 4. 순열의 각각의 원소에 대해 vector의 Index를 이진탐색을 통해 찾음 |
이 과정을 실제로 구현하면 아래와 같습니다.
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
int originalIntArray[1000000+10];
int totalInt;
int main(){
cin >> totalInt;
for(int i = 0; i<totalInt; i++){
cin >> originalIntArray[i];
}
// remove duplicate by set
set<int> intSet(originalIntArray, originalIntArray+totalInt);
// set to vector
vector<int> intVector(intSet.begin(), intSet.end());
// sort vector
sort(intVector.begin(), intVector.end());
for(int i = 0; i<totalInt; i++){
cout << lower_bound(intVector.begin(), intVector.end(), originalIntArray[i]) - intVector.begin() <<' ';
}
cout << '\n';
return 0;
}
반응형
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[백준] 리모컨 (0) | 2023.05.29 |
---|---|
[백준] Z (0) | 2023.05.29 |
[백준] Four Squares (1) | 2023.05.29 |
[백준] 팩토리얼 0의 개수 (1) | 2023.05.29 |
[백준] 유기농 배추 (0) | 2023.05.09 |