[JavaScript][Programmers]ボクサーを並べる


🔎 ボクサーのソート
リンク
https://programmers.co.kr/learn/courses/30/lessons/85002
📄 コミットコード
function solution(weights, head2head) {
  let map = []
  for (let i = 0; i < weights.length; i++) {
    let tmp = head2head[i];
    map.push([]);
    for (let j = 0; j < tmp.length; j++) {
      map[i].push(tmp[j])
    }
  }

  let total = [];
  let heavyWin = new Array(weights.length).fill(0);
  for (let i = 0; i < map.length; i++) {
    let all = 0;
    let win = 0;
    for (let j = 0; j < map[i].length; j++) {
      switch (map[i][j]) {
        case 'N': break;
        case 'W':
          all++;
          win++;
          if (weights[i] < weights[j]) heavyWin[i]++;
          break;
        case 'L': all++; break;
      }
    }
    console.log(`all : ${all}, win:${win}`)
    let percent = (win / all);
    // console.log(isNaN(percent))
    isNaN(percent) ? percent = 0 : percent;
    total.push([i,weights[i], heavyWin[i], percent]);
  }
  console.log(total);
  total.sort((a, b) => {
    if (b[3] == a[3]) {
      if (b[2] == a[2]) {
        if (b[1] == a[1]) {
          if (a[0] > b[0]) return 1;
          else return -1;
        } else if (b[1] > a[1]) return 1;
        else return -1;
      } else if (b[2] > a[2]) return 1;
      else return -1;
    } else if (b[3] > a[3]) return 1;
    else return -1;
  })
  console.log(total);
 
  var answer = [];
  total.forEach(el => {
    answer.push(el[0] + 1);
  });

  return answer;
}
let weights = [60, 70, 60];
let head2head = ["NNN", "NNN", "NNN"];
console.log(solution(weights, head2head));
これは6週目の越境挑戦問題です.
福書の対決目録を見て並べ替えた問題です.
ソート条件
  • 総勝率の高いボクサーの番号が前にあります.他のボクサーと対決したことのないボクサーの勝率は0%だった.
  • の勝率が同じボクサーの番号の中で、体重が自分より重いボクサーが勝った回数が多いボクサーの番号を前に進みます.
  • 自分より重いボクサーに勝った回数が同じボクサーの番号の中で、重いボクサーの番号が前に進む.
  • 自分の体重が同じ福書番号の中で、小さいサイズが前に進みます.
  • まず、head 2 headの対戦結果をmapに保存して勝率を得る.
    あと、mapの字が「N」なら何もせず、「W」なら総数と勝ち回数で+1、
    「L」の場合、合計+1のみになります.
    次に、パーセンテージを計算し、配列の合計数に挿入してソートします.
    この案の構造は「番号、体重、ヘビー級選手に何回勝ったか、勝率」だ.
    sortを用いて1回のソートを行い、この場合、ソート条件の順序でbがaより大きい場合は1を返し、aより大きくない場合は−1を返し、aがbより大きい場合は1または−1を返します.
    第1例の第3例は失敗したが、NaNは処理できなかった.
    そこでパーセンテージを計算し,isNaNで調べ,NaNであれば配列に追加した.
    そして採点にtestcase 6,7,8,9が失敗し、質問板で答えを得た.
    最初にパーセンテージを計算したときのMathfloorで2番目の位置を見つけて質問板にMathflowerをしないで直接計算して結果はそのままで通過しました
    だからパーセンテージ計算は直接win/allで通過しました