좌표 압축 기법- 18870번

2023. 2. 7. 02:11백준(c , c++)

728x90
  • 언제 사용하나? 

순위(대소)가 중요한 알고리즘에서 입력값의 개수보다 입력값의 범위가 클 때 사용.

예) 좌표의 범위는 약 40억이 넘지만 최대 입력값은 백만이다.

만약 좌표가 앞부분에 몰려있다면 나머지 부분은 불필요한 공간이라 탐색하지 않아도 된다.

좌표 압축을 통해 원하는 범위만 탐색할 수 있게 된다면 시간적,공간적으로 효율적이다. 

 

#define _CRT_SECURE_NO_WARNINGS //경고 제거
#include <stdio.h>
#include <vector>
#include<algorithm>

int main() {
	int N,input;
	std::vector<int> x1,x2; //int 범위: -20억 ~ 20억 정도
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {
		scanf("%d", &input);
		x1.push_back(input); //정렬,중복제거할 벡터
		x2.push_back(input); //기존 벡터
	}
	/*오름차순 정렬*/
	std::sort(x1.begin(), x1.end()); 
    
	/*내 인덱스가 곧 출력값이므로 중복되면 인덱스가 밀리니 중복 제거*/
	x1.erase(std::unique(x1.begin(), x1.end()), x1.end());
    
	/*정렬된 벡터 중에서 내 인덱스가 몇번째인지 출력하기*/
	int output;
	for (int i = 0; i < N; i++) {
		output=std::lower_bound(x1.begin(), x1.end(), x2[i]) - x1.begin(); 
		/*출력 순서는 기존 벡터 순으로 해야 하므로 3번째인자는 기존벡터의 원소로 지정
		->그래서 x2만들어서 저장한거임.*/
		printf("%d ", output);
	}
	return 0;

}
728x90

'백준(c , c++)' 카테고리의 다른 글

하노이의 탑  (0) 2023.02.21
25501-printf 함수  (1) 2023.02.08
10814번  (0) 2023.02.06
1181번  (0) 2023.02.06
2차원 배열을 정렬할 때 구조체 사용하기  (1) 2023.01.25