プログラマの最大数


問題の説明


0または正の整数を指定すると、最大の整数を見つけます.
例えば、与えられた整数が[6,10,2]である場合、最大数が6210である[610261010621026102106]を作成することができる.
パラメータに指定された配列番号が0または正の整数の場合、作成可能な最大番号を文字列に変換して戻すソリューション関数を作成します.

せいげんじょうけん


numbersの長さは1または10万以下です.
numbersの要素は1000を超えない.
答えが大きすぎるかもしれませんが、文字列に置き換えて返してください.

に答える


  • 最初の接近は桁数の異なる2つの数字の関係から始まった.例えば、3と34があれば、34は3の前にあるはずで、桁数を調整する作業が行われています.最大桁数は4桁なので、1桁~4桁の最小公倍数12桁を指定し、数字を繰り返し入力することで大きさを比較します.
    	n1 = 3 -> 333333333333
    	n2 = 34 -> 343434343434
    	결과: n1 > n2

  • 実は初めて3桁の最小公倍数6桁を比較し、1000の存在により誤処理され、4桁を含む最小公倍数12桁となった.

  • 入力された入力が0の場合、出力は0になるはずですが、得られません.この部分は別に変更された.

  • 実際に計算した値は大雑把に書かれているので,コードが非常に無邪気になるのは欠点である.
  • コードは次のとおりです.

    コード#コード#

    #include <string>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    bool cmp(int n1, int n2){
        long long t1, t2;
        if(n1 == 1000) t1 = 100000;
        else if(n1 / 100 >= 1) t1 = (n1 * 1000) + n1;
        else if(n1 / 10 >= 1) t1 = (n1 * 10000) + (n1 * 100) + n1;
        else t1 = (n1 * 100000) + (n1 * 10000) + (n1 * 1000) + (n1 * 100) + (n1 * 10) + n1;
        if(n2 == 1000) t2 = 100000;
        else if(n2 / 100 >= 1) t2 = (n2 * 1000) + n2;
        else if(n2 / 10 >= 1) t2 = (n2 * 10000) + (n2 * 100) + n2;
        else t2 = (n2 * 100000) + (n2 * 10000) + (n2 * 1000) + (n2 * 100) + (n2 * 10) + n2;
        t1 = (t1 * 1000000) + t1;
        t2 = (t2 * 1000000) + t2;
        return t1 > t2;
    }
    
    string solution(vector<int> numbers) {
        string answer = "";
        
        sort(numbers.begin(), numbers.end(), cmp);
        
        for(int i = 0; i < numbers.size(); i++){
            answer += to_string(numbers[i]);
        }
        if(answer[0] == '0') answer = "0";
        
        return answer;
    }
    

    ソース


    [プログラマー]https://programmers.co.kr/learn/challenges
    間違った説明や改善点があれば教えてください.ありがとうございます.