Solution
function solution(N, stages) {
let answer = [];
for (let i = 1; i <= N; i++) {
let arrive = stages.filter((a) => a >= i).length; // 도달한 플레이어 수
let noPass = stages.filter((a) => a === i).length; // 도달했지만 통과히지 못한 플레이어 수
let rate = noPass / arrive; // 실패율
answer.push([i, rate]);
}
answer.sort((a, b) => {
if (a[1] === b[1]) a[0] - b[0];
return b[1] - a[1];
});
answer.forEach((a, i) => (answer[i] = a[0]));
return answer;
}
풀이 설명
arrive
: i 번 스테이지에 도달한 플레이어 수
noPass
: i 번 스테이지에 도달했지만 통과하지 못한 플레이어 수
rate
: 실패율 (noPass / arrive)
for 반복문을 통해 스테이이지 수만큼 반복한하여 각 스테이지의 실패율을 계산한다.
[스테이지번호, 실패율]
을 answer
에 push 한다
실패율에 따라 내림차순으로 정렬해야한다. sort 함수를 사용할 수 있다. 여기서 주의할 점은 실패율이 같을 경우 스테이지 번호가 작은 것 부터 정렬한다.
answer.sort((a, b) => {
if (a[1] === b[1]) a[0] - b[0];
return b[1] - a[1];
});
각 배열에 [스테이지 번호, 실패율]
형태로 저장되어 있기 때문에 위와 같이 정렬할 수 있다.
실패율이 같을 경우 스테이지 번호가 작은 것으로 정렬
if (a[1] === b[1]) a[0] - b[0];
실패율이 큰 것부터 내림차순 정렬
return b[1] - a[1];
answer.forEach((a, i) => (answer[i] = a[0]));
return answer;
각 배열을 순환하면서 스테이지 번호(a[0])로 덮어쓴다.
내용 추가
아래와 같이 정렬할 때 실패율이 같다면 스테이지가 작은 것으로 정렬하는 과정은 사실 필요 없는 과정이었다..
answer.sort((a, b) => {
if (a[1] === b[1]) a[0] - b[0]; // * 삭제해야 할 코드
return b[1] - a[1];
});
이유는 이미 실패율을 계산하고 answer 에 push하는 과정에서 이미 첫번째 스테이지부터 차례로 push 되었기 때문이다.
for (let i = 1; i <= N; i++) {
let arrive = stages.filter((a) => a >= i).length; // 도달한 플레이어 수
let noPass = stages.filter((a) => a === i).length; // 도달했지만 통과히지 못한 플레이어 수
let rate = noPass / arrive; // 실패율
answer.push([i, rate]);
}