42889 실패율

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]);
}