解題→並べ替え


https://programmers.co.kr/learn/courses/30/lessons/85002

ボクサーのソート


問題の説明
パラメータはボクサーの体重とボクサーの戦績のhead 2 headです.ボクサーの番号を以下の順序で並べ、解題関数を完了して戻ります.
総勝率の高いボクサーの番号は前にある.他のボクサーと対決したことのないボクサーの勝率は0%だった.
勝率が同じボクサー番号のうち、体重が自分より重いボクサーが勝った回数が多いボクサー番号を前に進む.
自分より重いボクサーに勝った同じボクサーの番号の中で、体重がもっと重いボクサーの番号が前に移動します.
自分の体重まで同じボクサーの番号の中で、小さい番号が前にあります.
せいげんじょうけん
Weightsの長さは2または1000以下です.
Weightsのすべての値は45または150以下の整数です.
weights[i]はi+1番ボクサーの体重(kg)を表す.
head 2 headの長さはweightsの長さに等しい.
head 2 headのすべての文字列はweightsの長さと同じ長さの文字列で、「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]
I/O例説明
I/O例#1
次の表に選手たちのメッセージが表示されています.
選手番号vs 1番vs 2番vs 3番vs 4番勝率自分より重い服書勝ち回数体重1番-失敗勝利33.33%1回50 kg 2回勝利-失敗33.33%0回82 kg 3回失敗勝利-勝利66.66%2回75 kg 4回勝利失敗-66.66%0回120 kg
本明細書で説明した優先度に従って[3,4,1,2]を返す.
I/O例#2
次の表に選手たちのメッセージが表示されています.
選手番号vs 1番vs 2番vs 3勝率自分より重い福書回数体重1番勝った-失敗勝利50%0回145 kg 2勝利-失敗50%1回92 kg 3失敗勝利-50%1回86 kg
本明細書で説明した優先度に従って[2,3,1]を返す.
I/O例#3
次の表に選手たちのメッセージが表示されています.
選手番号vs 1番vs 2番vs 3番勝率は自分より重い福書回数体重1番--0%(無戦)0回2番--0%(無戦)0回3番--0%(無戦)0回0回
本明細書で説明した優先度に従って[2,1,3]を返す.
まず問題に答える前に間違えたので,長いこと責めてからやっと問題に答えた.
このインデックス(選手)のレベルをリストアップすべきだと思います.(はい、1番は全く同じです)
したがって、実施例2では[3,1,2]が引き続き出現し、問題の結果は[1,1,1]において条件を満たしていない人の順位が低下した.
[1,2,3]並べ替えの場合、条件に従って並べ替え中の要素を並べ替えます.
function solution(weights, head2head) {
  var answer = [];
  let n = weights.length;
  let person = weights.map((el, i) => {
    return { index: i, weight: el, winOver: 0, winRate: 0 };
  });
	// 승률과 체중미만 승리 구하기
  for (let i = 0; i < n; i++) {
    let totalCount = 0;
    let winCount = 0;
    for (let j = 0; j < n; j++) {
      if (head2head[i][j] === "W") {
        winCount++;
        if (weights[i] < weights[j]) person[i]["winOver"] += 1;
      }
      if (head2head[i][j] !== "N") totalCount++;
    }
    totalCount === 0
      ? (person[i]["winRate"] = 0)
      : (person[i]["winRate"] = winCount / totalCount);
  }
    // 정렬
    person = person.sort((a,b) => {
        if(a.winRate !== b.winRate) {
            return b.winRate - a.winRate
        }
        else {
            if(a.winOver !== b.winOver) {
                return b.winOver - a.winOver
            }
            else {
                if(a.weight !== b.weight) {
                    return b.weight - a.weight
                }
                else {
                    return a.index - b.index
                }
            }
        }
    })
    console.log(person)
  person.forEach(el => answer.push(el.index+1))

  return answer;
}
私はもう何度も問題を触ったことがありますが、私は以前のように安全に問題を解決すべきだと思います.だからifとelseでsort式を作りました.
他の人の解答を見て、3つの演算子がとても上手に書かれているのを見て、もっと練習すべきだと思います.
まず、問題を解くときは、まずpersonという配列の要素を対象に設定し、インデックス、体重、未満体重の勝利、勝率の4つのキーが入っていて、それぞれの値を見つけて入れます.
また,比較値がsortで等しくない場合は2つに処理し,等しくない場合は降順に並べ替えて次の条件に移行する.最後の条件では、昇順インデックスが使用されます.
インデックスは0から、選手番号は1からなので、答えるときに+1を付けます.
問題をもっと洗練したい