실패율은 다음과 같이 정의한다.
스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.입출력 예
스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
stages의 길이는 1 이상 200,000 이하이다.
stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
-각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
-단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
function solution(N, stages) {
var arrive = 0;
var not_clear = 0;
var fail_rate = [];
for(var i=1; i<=N; i++){
for(var j=0; j<stages.length; j++){
if(i===stages[j]){
not_clear++;
}
if(i <= stages[j] ){
arrive++;
}
}
fail_rate.push(arrive != 0 ? [i,not_clear/arrive] : [i,0]);
not_clear = 0;
arrive = 0;
}
fail_rate.sort((a,b) => b[1]-a[1]);
console.log(fail_rate);
return fail_rate.map(x => x[0]);
}
function solution(N, stages) {
var fail_rate = [];
for(var i=1; i<=N; i++){
var arrive = stages.filter(x => x >= i).length;
var not_clear= stages.filter(x => x===i).length;
fail_rate.push(arrive != 0 ? [i,not_clear/arrive] : [i,0]);
}
fail_rate.sort((a,b) => b[1]-a[1]);
return fail_rate.map(x => x[0]);
}
수정 전 코드는 내부 for문 안에서 조건문을 이용하여 스테이지에 도달했으나 아직 클리어하지 못한 플레이어수를
not_clear 변수에 스테이지에 도달한 플레이어 수를 arrive 변수에 카운트 해주고
내부 for문을 마치면 fail_rate 배열에 [스테이지 / 실패율] 형식으로 넣어주고 다음 스테이지의 실패율을 계산하기
위해 no_clear와 arrive 변수를 초기화 해주었다. 그런데 문제를 다 풀고 다른사람의 풀이를 보니 나와 전체적인
로직은 같은데 좀더 간결하게 코드를 짜신 분이 있어 몇가지를 배우고 코드를 수정하였다.
첫 번째로는 필터 함수를 이용하면 이중 for문과 조건문을 사용하지 않고 좀 더 간결하게 코드를 짤 수 있었고
두 번째로는 반복 문 안에 not_clear변수와 arrive 변수를 선언하면 매번 변수를 초기화 하는건 같으나 좀 더 코드를
깔끔히 짤 수 있었다는 점이다.
문제 조건에 도달한 사람이 없는경우 실패율을 0으로 책정하라고 기재되어 있어서 삼항연산자를 이용하여
도달한 사람이 없을 경우 실패율에 0을 넣는 방식으로 코딩을 진행하였다. 하지만 내가 참고한 분의 코드에는
도달한 사람이 없을 경우 실패율을 0으로 책정하는 코드가 보이지 않아(실제로 고려를 하고 코드를 짠걸 수 있겠지만)
어떻게 오류가 안날 수 있을까 궁금해져 sort메소드의 compare 메소드의 원리를 생각을 해보았다.
sort메소드의 원리는 compare 함수의 실행 결과가 음수냐 양수냐에 따라 정렬을 한다. 실험 결과
숫자, NaN) 또는 (NaN 과 NaN)을 연산하게 되면 NaN이 나오므로 음수도 양수도 아니기 때문에
배열의 두 요소는 자리변동 없이 자리를 유지하게 된다. 따라서 0으로 지정했을 때와는 다르게 정렬이 되므로 정렬이 제대로 되지 않을거 같았다..
하지만 내가 참고한 분의 코드가 통과할 수 있는 이유는 스테이지 검사를 오름차순으로 검사했기 때문에 앞의
도달한 스테이지만 비교검사가 정상적으로 진행되고 뒤의 도달하지 못한 스테이지는 자연스레 그 자리에 남아
오류가 발생하지 않은것 같다.
-생각하면서 NaN이 포함된 배열의 sort는 어떻게 진행될까 궁금하여 검색해보았다.
https://obscurejavascript.tumblr.com/post/125103356483/sorts-and-nan-in-javascript
이분의 코드를 살펴보면 NaN이 포함된 배열을 정렬할 때
sort메소드의 compare메소드를 참고할 수 있으니 참고하시길 바란다.