[Programmers](ハイスコアKIT)ソート-最大数


https://programmers.co.kr/learn/courses/30/lessons/42746
問題の説明
0または正の整数を指定すると、最大の整数を見つけます.
例えば、与えられた整数が[6,10,2]である場合、最大数が6210である[610261010621026102106]を作成することができる.
パラメータに指定された配列番号が0または正の整数の場合、作成可能な最大番号を文字列に変換して戻すソリューション関数を作成します.
せいげんじょうけん
numbersの長さは1または10万以下です.
numbersの要素は1000を超えない.
答えが大きすぎるかもしれませんが、文字列に置き換えて返してください.
I/O例
numbersreturn[6, 10, 2]"6210"[3, 30, 34, 5, 9]"9534330"
Solution
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool comp(string a, string b){
    return a + b > b + a;
}

string solution(vector<int> numbers) {
    string answer = "";
    vector<string> tmp;
    for(auto i : numbers){
        tmp.push_back(to_string(i));
    }
    sort(tmp.begin(), tmp.end(), comp);
    if(tmp[0] == "0") return "0";
    for(auto i : tmp) answer += i;
    return answer;
}
これは難しいと感じて、ためらった瞬間、無限の制止を経験した問題だ.違いを考える必要がある.
いずれにしても答えは文字列形式で、比較するときは2つの数の大きさだけを計算するのではなく、2つの数が異なる順序で加算されたときのどちらが大きいかを比較しなければならない.
これがただの数字であれば、6と10を比較すると、大きさを簡単に考えればいいだけです.しかし文字列なので考え方は違うはずです.610サイズですか、106サイズですか.文字列にしても、どうせ数字は大きい順にコード値を上げるので、大きい計算と小さい計算は完全にできます.
最初の値が0だったら?昇順で比較したのですが、そうなので意味のないデータと判断して0処理に戻ります.
そうでない場合は、ソート順に答え文字列を作成し、返します.