sort 커스텀 comparator

sort(v.begin(), v.end(), cmp)

기본 오름차순 말고 원하는 기준으로 정렬하는 법

내림차순

sort(v.begin(), v.end(), greater<int>());

람다로 커스텀 조건

// 절댓값 기준 오름차순
sort(v.begin(), v.end(), [](int a, int b) {
    return abs(a) < abs(b);
});

pair/vector 다중 조건 정렬

// 1번째 값 오름차순, 같으면 2번째 값 내림차순
vector<pair<int,int>> v;
sort(v.begin(), v.end(), [](const pair<int,int>& a, const pair<int,int>& b) {
    if (a.first != b.first) return a.first < b.first;
    return a.second > b.second;
});

문자열 길이 기준 정렬 (길이 같으면 사전순)

sort(v.begin(), v.end(), [](const string& a, const string& b) {
    if (a.length() != b.length()) return a.length() < b.length();
    return a < b;
});

주의사항

comparator는 반드시 “엄격한 약순서(strict weak ordering)“를 지켜야 한다. 즉 cmp(a, a)는 항상 false여야 하고, <= 같은 비엄격 비교를 넣으면 정렬 중 정의되지 않은 동작(런타임 에러 포함)이 날 수 있다.

abs(a)처럼 intabs()를 쓸 때, aINT_MIN이면 결과가 정의되지 않은 동작(UB)이 된다. 코테 입력 범위에서 실제로 마주칠 일은 드물지만, 절댓값 비교가 안전해야 하는 상황이면 long long으로 승격해서 계산한다.