[알고리즘] sort with STL, c++ 람다함수

2019. 8. 31. 12:50Programming/C++

1. 구조체를 활용한 Sort

기본적인 sort
보통 우리가 기본적으로 사용하던 sort는 2개의 인자를 사용했지만,

사실은 마지막에는 classfunction 의 자리이고,
디폴트 값으로 less 가 숨어있어 일반적인 sort(A.begin(), A.end()); 의 형식으로 사용 시 오름차순으로 정렬해주었던것이다.

sort(A.begin(), A.end(), classfunction); 

뜯어보면

sort(A.begin(), A.end(), less); //오름차순
sort(A.begin(), A.end(), greater); //내림차순


코드로 이해해보자!

#struct+person.cpp

#include "stdio.h"
#include 
#include 
#include 
using namespace std;


struct Person
{
    int age;
    int height;
    int weight;

    Person(int age, int height, int weight){
        this->age = age;
        this->height= height;
        this->weight = weight;
    }
};


bool cmpByAgeUp(Person a, Person b){
    //오름차순
    if(a.age < b.age){
        return true; 
    } else {
        return false; 
    }
}

bool cmpByAgeDown(Person a, Person b){
    //내림차순
    if(a.age > b.age){
        return true; 
    } else {
        return false; 
    }
}




int main(){


    Person psn1(10, 23, 42);
    Person psn2(23, 56, 36);
    Person psn3(14, 234, 2928);

    //cout << "age, height, weight : " << psn1.age <<" "<< psn1.height <<" "<< psn1.weight<<endl;
    

    vector contact;
    contact.push_back(psn1);
    contact.push_back(psn2);
    contact.push_back(psn3);

    

    cout <<"--age 오름차순--" << endl;
    sort(contact.begin(), contact.end(), cmpByAgeUp);
    for(int i = 0; i<(int)contact.size() ; i++){
     cout << contact[i].age <<", "<<contact[i].height<<", " <<contact[i].weight<< endl; 
    }
    
    cout <    sort(contact.begin(), contact.end(), cmpByAgeDown);
    for(int i =0 ; i<(int)contact.size(); i++){
        cout << contact[i].age << ", "<<contact[i].height<<", " <<contact[i].weight<< endl; 
    }

    cout <    sort(contact.begin(), contact.end(), [](Person a, Person b){ //밖의 값을 참ㅁ조하고싶으면 [&] (param) {} 이렇게 사용하면 됨
            //함수의 내용을 쓰면 됨 
            if(a.age < b.age){
                return true; 
            } else {
                return false; 
            }
        }
    );
    for(int i =0 ; i<(int)contact.size(); i++){
        cout << contact[i].age << ", "<<contact[i].height<<", " <<contact[i].weight<< endl; 
    }

    return 0;
}
실행화면




2. 람다함수의 활용


: 일회용 함수라고 생각하면 편함.
한번 실행 후 바로 소거됨
[변수 캡쳐](받을인자 ) -> 리턴타입{함수}(넘길인자)


C++에서의 람다함수는 모던 C++의 종류 중 하나이며,
모던 자바스크립트와 같은 행보를 걷는다.
꽤나 효율적인 재미있는 함수인듯 하다 💡
모던C++에 관한 설명은 링크

//기본형 : param a에 속하는 성분들만 사용 가능
[] (param a) { function; }

//param 이외에도, 모든 변수를 참조형으로 받기
[&] (param a) { function; }
//cf. 전역변수는 캡쳐해줄 필요 없음



3. 예제



#백준 11650 좌표정렬하기

/* Copyright (c) 2019, Pongsoyun
    Global Media Of Soongsil Univ. 
 
    This file is licenced under a Creative Commons license: 
    https://github.com/pongsoyun
*/

//No. 11650

#include "stdio.h"
#include 
#include 
#include 
using namespace std;
int N; //input N
int a=0, b=0; //input a, b

struct Cord{ //Coordinate
    int x;
    int y;

    Cord(int x, int y){
        this->x = x;
        this->y = y;
    } 
};

int main(){
    cin >> N;

    //Coordinate Array
    vector arrVec;

    for(int i =0 ;i<N; i++){
        cin >> a >> b; 
        arrVec.push_back(Cord(a,b));
    }

    //sort (x,y) 
    sort(arrVec.begin(), arrVec.end(), [](Cord a, Cord b){
        if(a.x==b.x){
            if(a.y<b.y){
                return true;
            }else{
                return false;
            }
        }else if(a.x < b.x){
            return true;
        }else {
            return false;
        }

    });

    
    for(int i =0 ;i<(int)arrVec.size(); i++){
        cout << arrVec[i].x <<" " <<arrVec[i].y << "\n";
    }

    return 0;
    
}


접근법
sort 함수의 3번째 param을 활용하여 푼다