문제 설명
실패율은 다음과 같이 정의한다.
스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
N | stages | result |
---|---|---|
5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3,4,2,1,5] |
4 | [4,4,4,4,4] | [4,1,2,3] |
풀이 과정
어려웠 던 부분
} else if(isNaN(sorted[i]) && isNaN(answer[j]) ) {
realAnswer[index] = j+1; // 확률이 0일 경우 'NaN'이 나오므로 이럴때도 확인해준다.
index ++
}
function solution(N, stages) {
let b = []; //스테이별 머문 사람의 수를 넣을 배열
let answer = [];
for (let i =1; i <=N; i++) {
let count = 0;
for(let j= 0; j < stages.length; j++) {
if ( i == stages[j]){
count++ //스테이지별로 머물러 있는 사람의 수를 카운트해서 카운트 배열(b)에 넣는다.
}
} b.push(count);
}
for (let i = 0; i <b.length; i++) {
answer.push(b[i]/stages.length); //answer배열에 스테이지별 클리어 못한 인원과 총 인원을 나눠 확률을 구한다.
stages.length = stages.length-b[i]; // 다음 스테이지는 전 스테이지 머문 인원을 총길이에서 빼준 수를 분모로 한다.
}
let realAnswer = [];
const copy = [...answer]; // answer배열이 변하면 안되기에 깊은 복사를 한다.
let sorted = copy.sort((a,b) => b-a); // copy 배열을 내림차순 정렬한다.
let index = 0;
for (let i = 0; i < answer.length; i++) {
for(let j = 0; j < answer.length; j++) { //내림차순 정렬한 배열과 answer배열을 비교하여
if (sorted[i]=== answer[j]) { //값이 같을때의 copy배열의 인데스 위치에 answer배열 인덱스+1을 해서 넣어준다.
realAnswer[index] = j+1; // 이러면 확률값의 순서가 단계별 순서로 바뀐다.
index ++
} else if(isNaN(sorted[i]) && isNaN(answer[j]) ) {
realAnswer[index] = j+1; // 확률이 0일 경우 'NaN'이 나오므로 이럴때도 확인해준다.
index ++
}
}
}
return Array.from(new Set(realAnswer)) // 중복값이 나오기 때문에 중복값을 Set으로 없애주고 다시 배열로 반환한다.
}
function solution(N, stages) {
let result = [];
for(let i=1; i<=N; i++){
let reach = stages.filter((x) => x >= i).length;
//N스테이지를 통과한 사람 모두의 수
let curr = stages.filter((x) => x === i).length;
//N스테이만을 통과한 사람의 수
result.push([i, curr/reach]);
//앞 원소를 스테이지 번호로 뒤 원소를 확률로
}
result.sort((a,b) => b[1] - a[1]);
return result.map((x) => x[0]);
}