본문 바로가기
Solved.ac/Class 2

c++ sort 함수 커스텀, 특정 조건 정렬, 우선순위 큐 정렬

by 강성주의 알고리즘 2020. 9. 7.

기본적인 삽입 정렬 및 선택 정렬은 아래 링크를 참조해주세요

2020/10/21 - [알고리즘] - 삽입 정렬 (InsertionSort), 선택 정렬 (Selection Sort) 비교 및 c언어 구현

 

삽입 정렬 (InsertionSort), 선택 정렬 (Selection Sort) 비교 및 c언어 구현

삽입 정렬과 선택 정렬은 O(N^2)의 비효율적인 정렬 방법입니다. 효율적인 정렬을 구현하고 싶으시면 아래 링크를 봐주세요 2020/08/17 - [알고리즘] - 머지 소트, 머지 소트 트리 및 관련 백준 문제 ��

seongjuk.tistory.com


알고리즘 문제를 해결하다보면 algorithm 헤더의 sort 함수를 유용하게 사용합니다.

이 sort 함수를 기존(Default) 정렬 방식이 아닌 주어진 문제에 맞는 정렬 방식을 사용하고 싶다면 sort 의 3번째 파라미터에 정렬 조건에 대한 비교 함수를 넣으면 자신이 원하는 정렬을 수행 가능합니다.

만약, 배열 Arr에 저장된 값들을 짝수보다 홀수에 우선순위를 주고, 오름차순으로 정렬하고 싶다면 아래와 같이 정렬가능합니다.

#include <algorithm>
#include <iostream>
using namespace std;
int arr[10] = { 2,8,4,6,7,5,1,3,10,9 };
int cmp(int a, int b) {
	if (a % 2 && b % 2) { // 둘다 홀수
		return a < b;
	}
	else if (a % 2) { // a만 홀수
		return 1;
	}
	else if (b % 2) { // b만 홀수
		return 0;
	}
	return a < b; // 둘다 짝수
}
int main() {
	cout << "커스텀 sort 실행 전\n";
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << " ";
	}
	cout << "\n";
	sort(arr, arr + 10,cmp);

	cout << "커스텀 sort 실행 후\n";
	for (int i = 0; i < 10; i++) {
		cout << arr[i] << " ";
	}
}

이 외 다양한 정렬 방식을 커스터마이즈하여 사용가능합니다.

또한 우선순위큐와 같은 정렬되는 자료구조에 대해서는 아래와 같이 정렬 옵션을 줄 수 있습니다.

만약 2차원 좌표에 대하여 x축 또는 y축과의 직선거리가 가까운 순서대로 정렬을 해야하는 경우 비멤버 연산자 operator를 사용하여 정렬 가능합니다.

#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;

struct info {
	int x;
	int y;
};
bool operator <(info a, info b) {
	return min(abs(a.x), abs(a.y)) > min(abs(b.x), abs(b.y));
}
int main() {
	info axis[5] = { {4,5} , {2,3}, {1,9}, {-6, 3}, {5,5} };
	priority_queue<info, vector<info> > pq;
	
	for (int i = 0; i < 5; i++) {
		pq.push(axis[i]);
	}
	cout << "좌표 정렬\n";
	while (!pq.empty()) {
		cout << pq.top().x << ", " << pq.top().y << "\n";
		pq.pop();
	}
}

 이를 응용하면 아래 문제들을 해결 할 수 있습니다.

www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

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

www.acmicpc.net

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

www.acmicpc.net/problem/11286

 

11286번: 절댓값 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0�

www.acmicpc.net

 

반응형