풀이의 핵심은 실패율 계산과 정렬입니다.
실패율 계산의 공식은 저의 경우에는 1-성공/도전
으로 정의했습니다. 1-성공률 = 실패율
성공의 횟수는 현재 스테이지가 해당 스테이지보다 높은 사람들의 숫자이며, 도전의 횟수는 현재 스테이지가 해당 스테이지보다 같거나 높은 사람들입니다. (일단 그 스테이지를 한번 거친 사람)
성공과 도전을 이용해서 성공률을 구해주면 되는데, 여기서 중요하게 생각해야 할 예외처리가 하나 있습니다. 바로 어떤 숫자를 0으로 나누면 안된다는 것인데요. 그래서 저는 아래 코드에서 challenger !== 0 ? clear / challenger : 1
와 같은 예외처리를 해주었습니다.
값 반환 시에 인덱스 번호와 실패율을 함께 반환하고 실패율을 내림차순으로 정렬하고 실패율이 같다면 인덱스 번호가 작은것 순으로 정렬하게 했습니다.
사실 실패율을 따로 계산 안하고 성공률의 오름차순으로 정렬해도 같은 결과를 얻을 것 같습니다.
그 이후에는 map
메소드를 이용해서 인덱스 번호만 따로 빼주었습니다.
let solution = (n, stages) => Array(n).fill(0).map((e, i) => {
let clear = 0;
let challenger = 0;
let currentStage = i+1;
for(let stage of stages){
if(stage > currentStage)
clear += 1;
if(stage >= currentStage)
challenger += 1;
}
let successRatio = challenger !== 0 ? clear / challenger : 1;
return [1 - successRatio, currentStage];
}).sort((b, a) => a[0] !== b[0] ? a[0] - b[0] : b[1] - a[1]).map(e=>e[1]);