본문으로 바로가기

[알고리즘] Sort 함수 이해

category 알고리즘 2020. 7. 12. 11:57

C++ 에서 Algorithm에 들은 sort 사용시,

 

quickSort이면서 좀 더 복합된(?) 로직으로 구현되어있다.

 

해당 함수는 

 

sort(시작, 끝, 비교함수) 로 구현할 수 있는데,

 

비교함수 구현시, bool type을 return 해주어야 하며,

 

True 이면 sort함수는 왼쪽이 오른쪽보다 먼저 나오게 해준다.
 * 사실 이게 좀 헷갈림..

 

비교함수 구현시 const &주소값으로 인자를 설정하여 reference로 받아 구현하는 경우가 많다.

 

이는 null 방지 혹은 값을 변경할수 없도록 const 를 붙여 구현하는걸로 보인다.

 

아래는 간단한 백준 문제와 이에 sort 및 비교함수를 사용하여 간단히 해결했다.

 

https://www.acmicpc.net/problem/11651

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 


#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;


bool comp(const pair<int, int> &a, const pair<int, int> &b){
	if (a.second > b.second){
		return false;
	}
	else if (a.second == b.second){
		return a.first < b.first;
	}
	else {
		return true;
	}
}

int main(){

	int n,inp1,inp2;
	vector<pair<int, int> > v;
	scanf("%d", &n);

	for (int i = 0; i < n; i++){
		scanf("%d %d", &inp1, &inp2);
		v.push_back(make_pair(inp1, inp2));
	}

	sort(v.begin(), v.end(), comp);


	for (int i = 0; i < n; i++){
		printf("%d %d\n", v[i].first, v[i].second);
	}

	return 0;
}