[JavaScript][Programmers] 복서 정렬하기

조준형·2021년 9월 6일
0

Algorithm

목록 보기
130/142
post-thumbnail

🔎 복서 정렬하기

❓ 문제링크

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주차 위클리 챌린지 문제다.
복서의 대결목록을보고, 정렬을 하는 문제다.
정렬 조건

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

먼저 승률을 구하기위해 head2head에 있는 대전결과를 map에다가 저장합니다.
그리고, map의 글자가 'N'이면 아무것도 하지않고, 'W'이면 전체 수랑 이긴횟수에 +1,
'L'이면 전체 수에만 +1을 합니다.
그리고 percent를 계산하여 정렬을 위한 배열 total에 넣습니다.

total에 들어갈 배열의 구조는 [번호, 몸무게, 몇번 무거운선수를 이겼는가, 승률] 입니다.

sort를 이용하여 한번에 정렬시키는데 이 때 정렬조건의 순서에 맞춰서 같은경우 다음 조건으로가서 b가 a보다 더크면 return 1, 아니라면 -1을 하여 리턴하였고, 마지막조건까지오면 a가 b보다 크면 1 아니면 -1을 리턴하여 정렬하였습니다.

처음에 3번째 예제가 실패가 떳었는데 NaN인 경우 처리를 못해서 그랬습니다.
그래서 percent를 계산하고 isNaN으로 검사하여 NaN인지 체크 후 NaN이라면 0을 넣고 아니면 그대로 배열에 추가하였습니다.

그 다음 채점시 testCase 6, 7, 8, 9가 실패했는데 질문게시판에서 답을 얻었습니다.
처음에 percent계산할 당시 Math.floor를 이용해 소수 2번째자리까지 구했는데, 질문게시판에서 Math.floor를 하지말고 그냥 계산한 결과 그대로 하면 통과한다고 되있었습니다.
그래서 percent계산을 그냥 win/all을 했더니 통과하였습니다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글