18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에
www.acmicpc.net
문제 이해가 너무 어려웠던 문제
문제 설명이 너무 불친절해요
그래서 구글링해서 해설을 좀 읽어보니까 이해한게
좌표 압축이라는 것은
좌표를 중복되지 않는 집합에 넣어뒀을 때, 자신보다 작은 원소의 개수로 자신의 수를 바꾸는 것
그럼 그렇게 하기 위해서는
배열을 받고,
오름차순으로 정렬을 해준 뒤,
중복되는 원소를 제거해주고,
자신보다 왼쪽에 있는 원소의 개수를 세어서 바꿔주면 된다
Unique, Erase 함수
중복된 값을 제거하기 위해서
<algorithm> 헤더파일을 사용해서 sort와 erase를 함께 씀
반드시 정렬을 해주고 사용해야하기 때문에 둘이 같이 사용!!
#include <algorithm>
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
[C++] Unique 함수 정리 및 예제 (tistory.com)
[C++] Unique 함수 정리 및 예제
◎ 시간 복잡도 : O(N) ◎ 중복된 값을 제거 하기 위해 사용하는 함수 ◎ 의 sort와 erase와 함께 사용함. ◎ 반드시 정렬을 해준 뒤 사용한다. 헤더파일 #include 사용법 vector v = { 2, 3, 5 , 2, 3, 5 ,4}; sort(v
8156217.tistory.com
.. 그리고 algorithm의 이진 탐색 함수를 사용해서 찾아줬는데
밑 포스팅을 참고함
lower_bound 이진탐색 함수
#include <algorithm>
int arr[6] = { 1,2,3,4,5,6 };
cout << lower_bound(arr, arr + 6, 6) - arr << "\n";
알고리즘 - c++ lower_bound, upper_bound 활용하기 | ChanBLOG (chanhuiseok.github.io)
알고리즘 - c++ lower_bound, upper_bound 활용하기
컴퓨터/IT/알고리즘 정리 블로그
chanhuiseok.github.io
좌표 압축 백준 18870번 c++ :: JArchive 프로그래밍 일기 (tistory.com)
좌표 압축 백준 18870번 c++
문제 링크 해당 값의 인덱스 위치를 출력하는 find() 함수를 썼을 때 시간초과가 났다. find() 함수는 순차탐색 하니까 시간복잡도가 O(N) 이다. 이미 정렬된 곳에서 탐색하는 거니까 이진 탐색으로
gdlovehush.tistory.com
제 코드는요
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, m;
cin >> n;
vector<int> v, r;
for(int i=0; i<n; i++){
cin >> m;
v.push_back(m);
r.push_back(m);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for(int i=0; i<n; i++){
cout << lower_bound(v.begin(), v.end(), r[i]) - v.begin() << " ";
}
return 0;
}
'‡ CODING TEST STUDY ‡ > º 백준' 카테고리의 다른 글
[백준 1003번 C++] 피보나치 함수 (0) | 2023.10.07 |
---|---|
[백준 10989번 C++] 수 정렬하기 3 (0) | 2023.09.28 |
[백준 1431번 C++] 시리얼 번호 (0) | 2023.09.27 |
[백준 2947번 C++] 나무 조각 (0) | 2023.09.27 |
[백준 10814번 C++] 나이순 정렬 (0) | 2023.09.26 |