Programmers Coding Quiz#42ボクサーのソート


問題の説明
パラメータはボクサーの体重とボクサーの戦績のhead 2 headです.ボクサーの番号を以下の順序で並べ、解題関数を完了して戻ります.
総勝率の高いボクサーの番号は前にある.他のボクサーと対決したことのないボクサーの勝率は0%だった.勝率が同じボクサー番号のうち、体重が自分より重いボクサーが勝った回数が多いボクサー番号を前に進む.自分より重いボクサーに勝った同じボクサーの番号の中で、体重がもっと重いボクサーの番号が前に移動します.自分の体重まで同じボクサーの番号の中で、小さい番号が前にあります.
せいげんじょうけん
  • weightsの長さは2または1000以下です.
  • weightsのすべての値は45または150以下の整数です.
  • weight[i]はi+1番ボクサーの体重(kg)を表す.
  • head 2 headの長さはweightsの長さに等しい.
  • head 2 headのすべての文字列は、長さと重量が等しい文字列であり、「N」、「W」、「L」からなる.
  • head 2 head[i]はi+1番ボクサーの戦績を示し、head 2 head[i][j]はi+1番ボクサーとj+1番ボクサーの試合結果を示す.
    「N」(None)は、2人のボクサーがまだ接触していないことを意味する.
    「W」(Win)はi+1番ボクサーがj+1番ボクサーに勝ったことを示した.
    「L」(Lose)はi+1番コピーがj+1番ボクサーに負けたことを示す.
  • 任意iの場合、head 2 head[i][i]は常に「N」である.彼は自分と戦うことができないからだ.
  • の任意のi,jについてhead 2 head[i][j]=「W」の場合、head 2 head[j][i]=「L」となる.
  • の任意のi,jについてhead 2 head[i][j]=「L」の場合、head 2 head[j][i]=「W」となる.
  • の任意のi,jについてhead 2 head[i][j]=「N」の場合、head 2 head[j][i]=「N」となる.
  • I/O例
    weightshead2headresult[50,82,75,120]["NLWL","WNLL","LWNW","WWLN"][3,4,1,2][145,92,86]["NLW","WNL","LWN"][2,3,1][60,70,60]["NNN","NNN","NNN"][2,1,3]
    に答える
    def solution(weights, head2head):
        counter = 1
        info = []
        for x,y in zip(weights, head2head):
            temp = {
                'no': counter,
                'weight': x,
                'win_rate': y.count('W')/(len(y)-y.count('N')) if len(y) > y.count('N') else 0,
                'h_point': len([weights[i] for i, v in enumerate(y) if v == 'W' and weights[i] > x])
            }
            info.append(temp)
            counter += 1
    
        info = sorted(info, key=lambda x: (-x['win_rate'], -x['h_point'], -x['weight'], x['no']))
    
        return [v['no'] for v in info]
    与えられた条件でPythonモジュールを用いて1つずつ並べ替えるだけでよい.
    問題のソート条件を整理するには、次の手順に従います.
    Step1. 勝率(勝率/総試合戦績!注意:N表示の場合は総試合戦績に入れない)`
    Step2. 高体重相手に勝つ回数
    Step3. 自分の体重
    Step4. 自分の数字
    ディックシーケンス番号とzipを用いて並べ替え条件を一度にクリーンアップした.zipを使用して、2つのリストで情報を同時に組み合わせることができます.
    勝率の場合、count関数を使用して「W」と表示された数を計算し、「N」を単独で計算し、総数(len)から差し引く.また、3つの演算子を用いて全選手の全試合を「N」(開いたことがない)の例3に対応させる.
    h point(自分より重い相手に勝った回数)では、リスト計算と列挙を使用して、勝った相手の体重をインデックスとしてインデックスに追加し、lenを使用して回数を計算できます.
    これらの情報を並べ替えてまとめた情報リストを並べ替えます.並べ替えの最も簡単な方法はkey = lambda x : (x[0], -x[1])のようにlambdaとtupleを利用することである.図例の条件順に実行します.この場合、x[0]のように正数面昇順−x[1]のように負数面降順で並べ替えられ、問題並べ替え条件のstep 1−3は降順で並べ替える必要があるため、負数で並べ替えなければならない.
    最後のソートされたリストで、戻り部分は「no」番号のみを返し、リストを返します.
    別の解釈
    def solution(weights, head2head):
        result = []
        l = len(weights)
        # 한 번에 정렬해서 풀어봅시다!
        ans = [[0 for _ in range(4)] for _ in range(l)] # 승률, 무거운복서 이긴횟수, 자기 몸무게, 번호(음수로)
        for i in range(l):
            ans[i][2] = weights[i]
            ans[i][3] = -(i+1)
            cnt = 0 # 판수
            for j in range(l):
                if head2head[i][j] == 'W':
                    ans[i][0] += 1 # 일단 이김
                    cnt += 1
                    if weights[i] < weights[j]:
                        ans[i][1] += 1 # 무거운 복서 이김
                elif head2head[i][j] == 'L':
                    cnt += 1 # 판수만 늘려준다
            if cnt == 0:
                ans[i][0] = 0
            else:
                ans[i][0] /= cnt
        ans.sort(reverse=True) # 역순으로 정렬하면 모든 조건이 한 번에 정렬된다
    
        for i in range(l):
            result.append(-ans[i][3])
        return result
    最も推奨されるソリューションを入手します.
    2 Dリストを挿入しながら並べ替えて問題を解決しました.