[C++] 프로그래머스 '가장 큰 수' 풀이

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항
  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
#include <string>
#include <vector>
#include <bits/stdc++.h>

using namespace std;

string solution(vector<int> numbers) {
    string answer = "";
    // numbers_len은 배열 numbers의 길이입니다.
    vector<string> v;
    int siz=0;
    for(auto e:numbers){
        v.push_back(to_string(e));
    }
    sort(v.begin(),v.end(),[](string a, string b){
        return a+b>b+a;
    }); 
    
    if(v[0]=="0") return "0";
    
    for(string s:v) answer+=s;
    return answer;
}

 

sort를 사용자 정의해야됨 

sort(v.begin(), v.end(), [](string a, string b) { return a+b>b+a; }); 

이 형태 기억할 것. 

 

아래는 헷갈리는 거 sort 세번째 인자에 대해 물어본 내용 

return이 비교값인데 sort가 맞게 되는 건지?

응. sort의 세 번째 인자는 비교 함수야.

 
sort(v.begin(), v.end(), compare);
 

여기서 compare(a, b)가 true를 반환하면,

 
a를 b보다 앞에 둬라
 

라는 뜻이야.

그래서 이 함수는:

 
[](string a, string b) {
    return a + b > b + a;
}
 

이 뜻이야.

 
a를 앞에 두는 게 더 큰 수를 만들면 true
아니면 false
 

예를 들어 a = "6", b = "10"이면:

 
a + b = "610"
b + a = "106"
 

"610" > "106"이니까 true.

즉:

 
"6"을 "10"보다 앞에 둬라
 

또 a = "10", b = "2"이면:

 
a + b = "102"
b + a = "210"
 

"102" > "210"은 false.

즉:

 
"10"을 "2"보다 앞에 두지 마라
 

그러면 "2"가 "10"보다 앞에 가게 돼.