이우의 개발일지
[STL] sort 정렬 함수 사용 방법/ 사용자 정의 비교 함수 사용/오름차순 내림차순 코드 본문
Sort 정렬 함수 오름차순
정렬함수 sort는 주어진 숫자들을 오름차순으로 정렬해주는 함수입니다.
코딩테스트 문제를 풀 때 유용하게 쓰이는 함수이죠. 시간 복잡도는 O(nlogn)입니다.
sort 기본 사용법
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {4, 2, 5, 3, 1};
std::sort(vec.begin(), vec.end());
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
결과
위처럼 sort는 sort(시작점, 끝점)을 통해 입력해주시면 됩니다. 이게 기본 사용형이고, 이렇게 하면 자연스레 1,2,3,4,5로 출력이 됩니다.
sort 사용자 정의 비교 함수 사용
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<std::vector<int>> vec = {{1, 4}, {3, 2}, {2, 5}, {4, 3}, {5, 1}};
// 사용자 정의 비교 함수로 정렬
std::sort(vec.begin(), vec.end(), [](const std::vector<int>& a, const std::vector<int>& b) {
return a[1] < b[1];
});
for (const auto& v : vec) {
std::cout << "{" << v[0] << ", " << v[1] << "} ";
}
return 0;
}
결과
기본형인 sort(시작점, 끝점)에서 뒤에 조건 하나가 더 추가 됐죠?
여기서 쓰이는 '[]' 는 람다 함수를 정의하기 위한 문법입니다. 람다 함수는 무명 함수로, 함수 객체를 간단하게 정의할 때 사용됩니다.
std::sort와 함께 사용될 때는 보통 사용자 정의 비교 함수를 제공하기 위해 사용됩니다.
람다 함수 기본 문법
[ 캡처 리스트 ] ( 매개변수 ) -> 반환형 {
함수 본문
}
- 캡처 리스트 [ ]: 아무것도 캡처하지 않습니다. 라는 뜻입니다.
sort(vec.begin(), vec.end(), [](const vector<int> &a, const vector<int> &b){
return a[1] < b[1];
});
- (const std::vector<int>& a, const std::vector<int>& b): 매개변수 리스트로, 두 개의 std::vector<int> 참조를 매개변수로 받습니다.
- { return a[1] < b[1]; }: 함수 본문으로, 두 벡터의 두 번째 요소를 비교하여 true 또는 false를 반환합니다.
만약 false이면 a와 b가 순서를 바꿔야한다는 것입니다.
Sort 정리
즉, sort 함수 기본형 -> sort(vec.begin(), vec.end());
sort 사용자 정의함수는 언제쓰냐?
정렬 기준이 2개 이상이거나, 비교해야하는 인자 요소가 한개가 아닐 경우
sort 함수 사용자 정의함수 형태->
sort(vec.begin(), vec.end(), [](const vector<int> &a, const vector<int> &b){
return a[1] < b[1]; //2번째 요소를 비교한 것, 1번째 요소를 비교하고 싶다면 a[0] < b[0]
});
Sort 내림차순
내림차순은 간단하게 sort 사용자 정의 함수 안에 기호를 반대로 해주면 됩니다.
원래는 a < b 이거였다면, 내림차순은 a > b 입니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<std::vector<int>> vec = {{3, 4}, {1, 2}, {5, 6}, {2, 3}};
std::sort(vec.begin(), vec.end(), [](const std::vector<int>& a, const std::vector<int>& b) {
return a[0] > b[0];
});
for (const auto& v : vec) {
std::cout << "{" << v[0] << ", " << v[1] << "} ";
}
std::cout << std::endl;
return 0;
}
결과
'Coding > Algorithm' 카테고리의 다른 글
[백준/C++] 11724번 연결 요소의 개수 / BFS 풀이 (0) | 2024.07.17 |
---|---|
[백준] BFS 유기농 배추 (0) | 2024.07.17 |
[C++] 동적할당 (0) | 2024.05.06 |
[C++] 문자열 비교 함수 만들기 (0) | 2024.05.05 |
[C++] 포인터 /포인터 정의/포인터 배열 (0) | 2024.05.05 |