복서 선수들의 몸무게(weight)와 전적(head2head)을 매개변수로 받아, 아래와 같은 조건으로 선수 번호를 정렬한 후 리턴해야하는 문제
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
입출력 예시
let output1 = solution([50, 82, 75, 120], ["NLWL", "WNLL", "LWNW", "WWLN"]); // -> [3,4,1,2]
console.log(output1);
let output2 = solution([145, 92, 86], ["NLW", "WNL", "LWN"]); // -> [2,3,1]
console.log(output2);
let output3 = solution([60, 70, 60], ["NNN", "NNN", "NNN"]); // -> [2,1,3]
console.log(output3);
각 선수들의 필요한 정보들을 하나의 배열 안에 담아 이중배열을 만든 다음, 조건에 맞게 차례대로 sort를 해주는 식으로 문제를 풀었다. 배열 안에 담아야 하는 데이터는 다음과 같다.
- 선수의 승률
- 나보다 더 몸무게가 더 높은 선수를 이긴 횟수
- 나의 몸무게
- 선수 번호
이 순서대로 정보를 배열에 담아 조건에 맞게 정렬한 후, 선수 번호만 뽑아서 리턴해주었다.
이 풀이 방법을 코드로 구현하면 다음과 같다.
function solution(weights, head2head) {
let result = [];
for (let i = 0; i < weights.length; i++) {
let win = 0;
let lose = 0;
let over = 0;
// weights[i] => 선수의 몸무게
// head2head[i] => 선수의 전적 (length가 같기 때문)
// head2head[i][j] => 각 경기의 승패
for (let j = 0; j < head2head[i].length; j++) {
// N은 아무것도 하지 않음
if (head2head[i][j] === "N") continue;
if (head2head[i][j] === "L") lose++;
if (head2head[i][j] === "W") {
// weights[i] => 선수의 몸무게
// weigths[j] => 대결 상대의 몸무게
// 대결한 상대의 몸무게가 더 크면
if (weights[i] < weights[j]) {
over++;
}
win++;
}
}
// 승률
let rate = win / (win + lose);
// 각 선수의 정보를 한 배열 안에 담음
result = [...result, [rate, over, weights[i], i + 1]];
}
// 배열을 정렬
result.sort((a, b) => {
// 승률 내림차순 정렬
if (a[0] > b[0]) return -1;
if (a[0] < b[0]) return 1;
// 승률이 같으면?
// 나보다 무거운 상대 이긴 횟수 내림차순 정렬
if (a[1] > b[1]) return -1;
if (a[1] < b[1]) return 1;
// 나보다 무거운 상대 이긴 횟수가 같으면?
// 몸무게 내림차순 정렬
if (a[2] > b[2]) return -1;
if (a[2] < b[2]) return 1;
// 몸무게마저 같으면?
// 선수 번호 오름차순 정렬
if (a[3] > b[3]) return 1;
if (a[3] < b[3]) return -1;
return 0;
})
// 정렬된 배열에서 선수 번호만 매핑
return result.map(el => el[3]);
}