[programmers]-最大数


1. Problem 📃


📚 ソース-プログラマ
問題の説明
0または正の整数を指定すると、最大の整数を見つけます.
例えば、与えられた整数が[6,10,2]である場合、最大数が6210である[610261010621026102106]を作成することができる.
パラメータに指定された配列番号が0または正の整数の場合、作成可能な最大番号を文字列に変換して戻すソリューション関数を作成します.
せいげんじょうけん
  • numbersの長さは100000より大きい.
  • numbersの要素は1000を超えません.
  • 答えが大きすぎるかもしれませんが、文字列を変えて返してください.
  • I/O例
    numbersreturn[6, 10, 2]"6210"[3, 30, 34, 5, 9]"9534330"

    2. Logic 👨‍🏫


    シーケンスコード
    1.順番に表示できる全ての状況の数を求める.この場合、tuple形式に戻るので、リスト形式に変換する必要があります.
    2.joinを使用して文字列をマージするには、データ型が文字列の場合を前提とします.したがって、入力したデータ型を文字列に変換し、すべての場合に順番に表示できる数字を表し、joinにマージすればよい.
    3.ソートで最大数を返します.
    しかし利用順で解くとタイムアウトで解決できない.
    理由を調べてみると、ソートなど、時間の複雑さはO(N!)そのためタイムアウトが発生しました.
    そこで,時間的複雑度の高いハッシュ技術を用いて解いた.
    ハッシュによって解析されたコード
    1.整数型データ型のリストを文字列リストに変換します.
    2.ランダによる比較ソート.
    3.並べ替えられたリストをまとめて返します.

    3. Code 💻


    1.シーケンスを使用して解いた私のコード😁

    from itertools import permutations # 순열
    
    def solution(numbers):
        for i in range(len(numbers)):
            numbers[i] = str(numbers[i])
        perList = list(map(''.join, permutations(numbers, len(numbers))))
        return sorted(perList)[-1]

    2.他人のコードを参考にする😁

    def solution(num): 
        num = list(map(str, num))
        num.sort(key = lambda x : x*3, reverse=True)
        return str(int(''.join(num)))
    lambda x: x*3はnumパラメータの各文字列を3回繰り返すことを示す.
    numの買収値は1000以下なので、3桁に調整して比較します.
    ここでlambda x: x*3を示すのは、[21,24,24,27,27]というリストがある場合、
    [「2121121」、「242424」、「272727」、「222」に変換]ここでソートすると、文字列比較はASCII値に変換されて比較されます.
    したがって、ASCII値は、「27272727」、「242424」、「222」および「21212121」の順に並べられる.
    最終的には「『27』『24』『2』『21』」と並ぶ
    最後の行がintに変換されたのは,「0000」などの数で記述されたコードである.