[プログラマー]最大数(C++)


📌 リファレンス
引き渡しアルゴリズム研究に関わる問題は19週目からBellogに記録される(18週前に復習してアップロードする予定)🤗) 他の個人が回答した基準やプログラマの質問は、自分が意味があると思っている部分だけをフィルタリングしてBellogに記録します.Bellogにアップロードされていない他の質問やコードを知りたい場合は、次のGithubでさらに確認できます.👀 ご来店ありがとうございます🙏
💚 github | dianstar/Algorithm-BOJ
💚 github | dianestar/Algorithm-Programmers

エンコードテスト高得点Kit>ソート


最大数|問題のショートカット

解答(2022年1月21日FRI)💻)


🤔 チャット+🚨 うっかり


最初は簡単に順番を使って解けばいい!でもタイムアウト...
ソートは、実際には可能な限り数値を作成して確認します.
非常に非効率...言える💧
でも順番論理を復習するのは久しぶりで有意義な時間(?)
次のコードにコメントするのが惜しいものがあります.
⭕もちろんC++アルゴリズムヘッダに含まれるnext置換でシーケンスを求めることもできます

解の核心


タイムアウトの問題を解決できません.
Googleを通じて、他の人のコードを参考にして修正しました.
👉 カスタムcmp関数を作成することで、ソート基準としてsortに入れる方法が見つかりました.
cmp関数の場合、2つの文字列を比較します.
2つのstringをつなぐ2つの方法の中で、もっと大きく戻せばいいのですex) string "7"과 string "31"을 이어붙이는 경우, "7"+"31" = "731"</span> 이 "31" + "7" = "317" 보다 크므로 "731"이 반환된다👉 注意すべき点は、文字列型の数字を比較することです.
numbers要素の0は最大の数値(+numbersの長さは2より大きい).
  • numbersの長さは100000より大きい.
  • numersの要素は1000を超えません.
  • このような条件により、答えは「00」「000」と同じ異常値(?)これは値かもしれないからです.
    答え=「0」答えの値を適切に変えるex) vector<int> numbers = { 0, 0, 0 } 일 경우 answer가 "000"이 될 수 있음

    🔽 コード(C+)

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    bool cmp(const string &x, const string &y) {
        return x+y > y+x;
    }
    
    string solution(vector<int> numbers) {
        string answer = "";
        int N = numbers.size();
        
        // string으로 변환
        vector<string> strings;
        for (int i=0; i<N; i++) {
            strings.push_back(to_string(numbers[i]));
        }
    
        // 정렬 (cmp 함수 : 숫자 두 개씩 이어붙인 값 비교)
        sort(strings.begin(), strings.end(), cmp);
    
        // 정렬한 순서대로 숫자 이어붙여서 answer 값 구하기
        for (int i=0; i<N; i++) {
            answer += strings[i];
        }
    
        // 주어진 numbers에서 가장 큰 값이 0인 경우 answer = '0' 처리
        if (answer[0] == '0') {
            answer = '0';
        }
    
        return answer;
    }
    
    /* cf) permutation 활용 시 시간 초과
    vector<string> candidates;
    
    void permutation(vector<string> strings, int depth, int n) {
        if (depth == n) {
            string s = "";
            for (int i=0; i<n; i++) {
                s += strings[i];
            }
            candidates.push_back(s);
        }
    
        else {
            for (int i=depth; i<n; i++) {
                swap(strings[depth], strings[i]);
                permutation(strings, depth+1, n);
                swap(strings[depth], strings[i]);
            }
        }
    }
    
    string solution(vector<int> numbers) {
        string answer = "";
    
        vector<string> strings;
        int N = numbers.size();
        for (int i=0; i<N; i++) {
            strings.push_back(to_string(numbers[i]));
        }
        permutation(strings, 0, N);
        sort(candidates.begin(), candidates.end(), greater<>());
        answer = candidates[0];
    
        return answer;
    }
    ********************************/