sort() 와 사용자 지정 compare 함수

whipbaek·2022년 2월 14일
0

알고리즘

목록 보기
4/5

sort()

sort()함수는 C++의 algorithm 헤더에 포함되어 있는 정렬 함수이다.

두가지의 형태로 오버로딩 되어있다.

template <typename T>
void sort(T start, T end);

template <typename T>
void sort(T start, T end, Compare comp);

comp 함수를 따로 명시해주지 않는다면 오름차순으로 정렬된다.

여기서 조심할 점은 end는 배열의 끝 +1의 위치를 적어주어야한다. (vector의 경우 end())

compare

문제를 푸는데 compare 함수의 정의가 헷갈려 글을 쓰게 되었다.

기본적으로는 오름차순을 지원하기에, 내림차순은 아래와 같이 함수를 작성해주면 된다.

bool compare(int a, int b){
	return a > b;
}

오름차순은 < , 내림차순은 > 형태이다. 다른 블로그에서 보았는데 < 모양이 크레센도와 닮았으니 뒤로 갈수록 큰값이 존재한다고 생각하면 외우기 쉽다.

이번에는 pair 값을 받았을때 정렬 함수를 작성하는 방법이다.

#define pp pair<string,int> 

bool compare(pp a, pp b) {
    if (a.second == b.second) return a.first < b.first;
    return a.second < b.second;
}

위 코드는 2번째 값을 기준으로 오름차순 정렬을 하는 코드이다.
값이 같을때 예외처리를 해주는 부분을 제외하고는 동일한 코드이다.

문제

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

해당 문제를 풀 때 map으로 string과 string길이를 입력받고, 그 값을 vector로 옮겨주었다.
짧은 문자열부터 출력해야하기에 이 때 vector의 2번째 값을 기준으로 오름차순 정렬해주었다.

#include <bits/stdc++.h>
#define pp pair<string,int> 

using namespace std;

bool compare(pp a, pp b) {
    if (a.second == b.second) return a.first < b.first;
    return a.second < b.second;
}

int main(void) {
    
    int t;
    string str;
    map<string, int> m;

    cin >> t;

    while (t--) {
        cin >> str;
        m.insert(make_pair(str, str.size()));
    }

    vector<pp> vp(m.begin(), m.end());
    sort(vp.begin(), vp.end(),compare);

    for (pp val : vp) cout << val.first << "\n";

    return 0;
}
profile
코딩 및 CS에 관하여 공부합니다.

0개의 댓글