c++ sort 함수에 전달해주는 compare 함수에 관하여 2
#include <bits/stdc++.h>
using namespace std;

bool compare(int a, int b){
    cout<<"comparing "<<a<<" and "<<b<<'\n';
    return a>b;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); 

    int n;
    cin>>n;
    int a[1000];
    for(int i=0; i<n; i++){
        cin>>a[i];
    }
    sort(a,a+n,compare);

    for(int i=0; i<n; i++){
        cout<<a[i]<<',';
    }
}

 

 

d

인터넷에서 본 방법으로 compare 함수 내부에 이런식으로 cout을 통해서 출력문을 넣거나, 혹은 요소마다의 판별 요소를 출력하면서 출력해보니까, false일때는 그냥 그대로 두고, 이때 헷갈리지 않아야 하는데, int a, int b 라고 받아들이는게, 그냥 평범하게 생각하면 배열같은 곳에서 int a가 더 앞쪽의 요소, int b가 더 뒤쪽의 요소 라고 생각하게 될 수 있는데, 

막상 compare 함수 내부에 출력문을 넣어서 찍어보니 int a가 더 뒷쪽의 요소, int b가 더 앞쪽의 요소가 된다. 

그래서 이때 true false도 내가 인터넷에서 접하는 블로그에서 본 설명들과는 다르게 정 반대로 나온다. 

그렇담 이건 true 가 될때 정렬을 시행하고 첫번째 원소와 두번째 원소의 위치를 다르게 생각해서 compare 함수를 만들어야 할것으로 보여진다. 

 

 

++++++++++++++++++++++

(23.5.18)

bool cmp(string& a, string& b)  {
    cout<<"Comparing "<<a<<" and "<<b<<'\n';
    int lena=a.size(),lenb=b.size();
    int suma=0, sumb=0;
    if(lena!=lenb){
        bool letsfind=(lena<lenb);
        cout<<"lena<lenb is "<<letsfind<<'\n';
        return lena<lenb;
    } 
    /*
    내가 공부한 것으로 되돌아보면, a는 뒤에것, b는 앞에것
    그렇다는 얘기는 여기서 return lena<lenb;는,
    앞에것의 길이값이 뒤에것의 길이값보다 크다면, true를 반환하고,
    그럴때 위치를 바꾸며 정렬이 이루어질것이다. 그렇게 되면 다시 앞에것의
    길이값이 작아질 것이고, 뒤의것이 길이값이 길어질것이다. 
    그렇다면 그건 원하는 형태의 정렬이 될것이다.
    결국 이건 true를 반환하면 정렬을 행한다, 
    false를 반환하면 정렬을 행하지 않는다. 
    그때에 a요소는 뒤에 원소, b요소는 앞의 원소이다. 
    */
   for(int i=0; i<lena;i++){ //숫자만 더한다.
    if(isdigit(a[i])) suma+=(a[i]-'0');
   }
   for(int i=0; i<lenb;i++){
    if(isdigit(b[i])) sumb+=(b[i]-'0');
   }
   if(suma!=sumb) {
        bool letsfind=(suma<sumb);
        cout<<"suma<sumb is "<<letsfind<<'\n';
        return suma<sumb;
        
   }
   bool letsfind=(a<b);
   cout<<"a<b is "<<letsfind<<'\n';
   return a<b; //사전순 부분.
}

이 내용을 보면서 다시 내용을 상기해보면,

compare 함수에 원소로 a,b 를 보낼때, a가 뒤에원소, b가 앞에원소.

그리고 return 값이 0이면 그대로 두고 자리를 안바꾸고 다음 비교로 넘어가고, return 1이 되면 자리를 바꾸면서 다시 자리가 바뀐

원소와 그 인접하게된 원소와의 사이에서 비교. 

 

이게 결국 따지고 보면 첫번째 인자가 컨테이너에서의 후순위 인자, 두번째 인자가 컨테이너 에서의 선순위 인자인데, 

이거 이해를 하고나서, 내가 원하는 결과대로 만약 출력을 하고싶으면,

예를들어서 뒤로 갈수록 커지는 순서(오름차순) 같이 정렬을 하고 싶다면, 

 

첫번째 인자, 두번째 인자

return 첫번째 인자와 관련된 값< 두번째 인자와 관련된 값

 

형태로 만들어서 compare 함수를 넘겨주면 된다. 

꼭 

첫번째 인자, 두번째 인자

return 첫번째 인자< 두번째 인자 

형태로 할 필요 없으며, 

첫번째 인자와 관련된 값< 두번째 인자와 관련된 값

형태로 만들어서

결국 1을 반환하느냐 0을 반환하느냐에 따라서 정렬을 시행하느냐 아니면 시행하지 않느냐가 되니까

정렬을 시행시킬 수 있다. 

boj 1431번 문제를 푼다고 했을때도, 이때 

첫번째 인자와 관련된 값 vs 두번째 인자와 관련된 값 

을 비교해서 이때에 <의 방향을 어디로 놓느냐에 따라서 정렬순서를 결정할 수 있다. 

 

  Comments,     Trackbacks