boj 1181번 문제를 통해 보는 sort의 compare 함수의 람다표현식으로의 사용.
#include <bits/stdc++.h>
using namespace std;
string st[20'005];
bool cmp(const string& a, const string& b){
    int lena=a.size(),lenb=b.size();
    if(lena!=lenb) return lena<lenb;
    return a<b;
}
int main(){
    ios::sync_with_stdio(0); 
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0; i<n; i++) cin>>st[i];
    sort(st,st+n,cmp);
    for(int i=0; i<n; i++){
        if(i==0||st[i-1]!=st[i]) cout<<st[i]<<'\n';
    }
}

내가 작성한 함수는 이렇게 cmp함수를 위에 따로 작성해서 sort에 넘겨주었고, 참고용 정답 코드를 보았을때의 표현을 보면 

 

// Authored by : tongnamuu
// Co-authored by : -
// http://boj.kr/e365634189b1497a95abaf856df7758f
#include <bits/stdc++.h>
using namespace std;

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin>>n;
  vector<string>a(n);
  for(int i=0;i<n;++i) cin>>a[i];
  sort(a.begin(), a.end(), [](const string& u, const string& v){
    int ul = u.length();
    int vl = v.length();
    if(ul!=vl) return ul < vl;
    return u < v;
  });
  a.erase(unique(a.begin(), a.end()), a.end()); // a에서 중복된 원소를 제거하는 명령
  for(string& s : a) cout<<s<<'\n';
  return 0;
}

 

이렇게 바로 sort 함수 내부에 람다식을 이용해서 함수를 박아넣었다. 직렬함수?

그래서 이와 관련하여서 한번 검색을 해보았다. 

이렇게 작성해서 결국 얻을 수 있는 이점은, 간단한 함수를 작성하여서 특정한 함수의 인자로 전달할때, 바로 그 전달받아야 하는 위치에 람다표현식을 통해서 함수를 정의해서 표현해주고, 함수의 정의도 바로 그 위치에서 확인할 수 있어서 코드의 가독성과 유지보수성을 향상시킬 수 있다고 한다.

 sort를 활용해서 compare함수를 넘겨주어서 문제를 해결할때, 만약 compare함수가 간단한 형태이면 이렇게 람다표현식을 통해서 바로 인라인으로 작성하면 충분하게 가독성을 해치지 않으면서 유지보수성을 향상시킬 수 있을것 같다.

 []을 활용하여서 람다 표현식의 선언부를 나타내고 한번 함수를 삽입해보도록 하자. 

그리고 앞으로 이러한 표현을 만나면 []부터 함수의 선언부임을 명확하게 인지하고 해석을 잘 해보도록 하자. 

 

  Comments,     Trackbacks