## 🌟 문제 [코딩테스트 연습 - 실패율 \| 프로그래머스 스쿨](https://school.programmers.co.kr/learn/courses/30/lessons/42889) 주어진 공식대로 실패율을 구해서, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return하기. ## 🌟 풀이 공식을 사용하기 위해서 필요한 데이터를 구하는 것이 관건이었던 것 같다. 실패율의 정의는 `스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수` 인데, 주어진 데이터는 `플레이어가 현재 멈춰 있는 스테이지의 번호`이다. ![[c1998960-f035-4132-a429-4025119e1817.png]] 스테이지에 도달한 플레이어 수는 누적된 값이라서 괜찮은 방법을 생각하기 좀 어려웠는데, k번째 스테이지에 도달한 플레이어 수는 k번째 스테이지에 도전하고 있는 플레이어 수 + k번째 이후 스테이지에 도전하고 있는 플레이어 수라는 것을 이용해서 풀었다. 첫번째 스테이지에 도달한 플레이어 수는 전체 플레이어일 것이고, 이후부턴 이전 스테이지에 도전중인 플레이어 수를 빼 주면서 구해줬다. ![[856ab946-775c-4cc5-b4e4-1a797aad470b.png]] ```javascript function solution(N, stages) { // k번째 스테이지에 도전중인 플레이어를 구하기 // N + 2 : 스테이지 번호가 1부터 시작 + 모두 통과한 플레이어도 커버하기 위함 const stagePlayers = new Array(N + 2).fill(0); for (const stage of stages) { stagePlayers[stage]++; } // 실패율 구하기 (여전히 도전중인 플레이어 / 도달한 적이 있는 플레이어) const fails = {}; // 실패율 let totalPlayers = stages.length; // 전체 플레이어의 수 for (let k = 1; k <= N; k++) { if (stagePlayers[k] === 0) { // 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0으로 정의한다. fails[k] = 0; } else { fails[k] = stagePlayers[k] / totalPlayers; totalPlayers -= stagePlayers[k]; } } // fails 정렬하기 const answer = Object.entries(fails) .sort(([_, failRate1], [__, failRate2]) => failRate2 - failRate1) .map(([stageNum]) => Number(stageNum)); return answer; } ```