Notice
Recent Posts
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
관리 메뉴

이우의 개발일지

[STL] sort 정렬 함수 사용 방법/ 사용자 정의 비교 함수 사용/오름차순 내림차순 코드 본문

Coding/Algorithm

[STL] sort 정렬 함수 사용 방법/ 사용자 정의 비교 함수 사용/오름차순 내림차순 코드

공대이우 2024. 5. 21. 22:04

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];
 });
  1. (const std::vector<int>& a, const std::vector<int>& b): 매개변수 리스트로, 두 개의 std::vector<int> 참조를 매개변수로 받습니다.
  2. { 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;
}

결과

반응형