습관처럼

C++ - Compare(feat: sorting, algorithm) 본문

Language/C++

C++ - Compare(feat: sorting, algorithm)

dev.wookii 2020. 3. 4. 10:40

알고리즘을 풀때 Sorting을 내림차순 또는 오름차순으로 하죠?~^^ 이때 보통 내림차순은 greater<int>()를 사용하여 내림차순 또는 오름차순을 정의했습니다. 하지만 비교대상이 일차원을 넘을경우 어떻게 처리하는지 알아보도록 하겠습니다.

 

Default 오름차순 Sorting - 오름차순으로 비교할때는 그냥 Sorting을 하면 됩니다~

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(){
    vector<int>a;
    a.push_back(1);
    a.push_back(31);
    a.push_back(14);
    a.push_back(12);
    a.push_back(11);
    a.push_back(15);
    a.push_back(2);
    sort(a.begin(),a.end());
    for(int number:a) cout<<number<<"\n";
    return 0;
}

내림차순 Sorting - greater<int>() 원소가 하나일 때~

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(){
    vector<int>a;
    a.push_back(1);
    a.push_back(31);
    a.push_back(14);
    a.push_back(12);
    a.push_back(11);
    a.push_back(15);
    a.push_back(2);
    sort(a.begin(),a.end(),greater<int>());
    for(int number:a) cout<<number<<"\n";
    return 0;
}

내림차순 Sorting 비교대상이 하나이상 - vector, pair 이용할 때~ 

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
bool compare(pair<int,int>a,pair<int,int>b){
    if(a.first==b.first) 
    	return a.second>b.second;
    else 
    	return a.first>b.first;
}
int main(){
    vector<pair<int,int> >a;
    a.push_back(make_pair(1,23));
    a.push_back(make_pair(3,45));
    a.push_back(make_pair(532,34));
    a.push_back(make_pair(11,34));
    a.push_back(make_pair(11,94));
    a.push_back(make_pair(15,917));
    a.push_back(make_pair(2,88));
    sort(a.begin(),a.end(),compare);
    for(int i=0;i<a.size();i++){
        cout<<a[i].first<<" "<<a[i].second<<"\n";
    } 
    return 0;
}

내림차순 Sorting 비교대상이 하나이상 - vector, pair 2개 이상~

 

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
bool compare(pair<int,pair<int,int> >a,pair<int,pair<int,int> >b){
    if(a.first == b.first){
        if(a.second.first == b.second.first) return a.second.second > b.second.second;
        else return a.second.first > b.second.first;
    }
    else return a.first > b.first;
}
int main(){
    vector<pair<int,pair<int,int> > >a;
    a.push_back(make_pair(1,make_pair(1,6)));
    a.push_back(make_pair(5,make_pair(2,5)));
    a.push_back(make_pair(2,make_pair(9,7)));
    a.push_back(make_pair(59,make_pair(2,2)));
    a.push_back(make_pair(2,make_pair(5,9)));
    sort(a.begin(),a.end(),compare);
    for(int i=0;i<a.size();i++){
        cout<<a[i].first<<"::"<<a[i].second.first<<"::"<<a[i].second.second<<"\n";
    } 
    return 0;
}

이제 직접 크기대소 compare function을 만들어 사용하시면 더욱 효육적을 코딩할 수 있을것입니다~ ^0^