TIL20-04 inNaN()의 활용

김태혁·2023년 2월 1일
0

TIL

목록 보기
72/205
  • 문제 설명
    실패율은 다음과 같이 정의한다.
    스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    전체 스테이지의 개수 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]
  • 풀이 과정

    • 스테이지별 머문 사람의 수를 구한다.
    • 스테이지별 클리어 못한 사람의수/총 인원 = 확률
    • 다음 스테이지 : 해당스테이지 클리어 못한 사람/ 총 인원-전 스테이지 클리어 못한 사람 = 확률
    • 위를 반복 시켜 스테이지 별 실패 확률을 구한다.
    • 확률 값을 내림차순 정렬한다.
    • 확률에 해당하는 스테이지 번호로 변경해준다.
  • 어려웠 던 부분

    • 큰 어려움이 없이 코드를 써 내려갔지만 테스트 결과 70프로가 나왔다.
    • 원인을 찾아보니 해당스테이지 클리어 인원이 없으면 확률이 0이 되는데 0이면 'NaN'값으로 표시 된다.
    • 'NaN'값을 isNaN()으로 true여부를 확인한 후에 해당 스테이지 번호로 변경해주어야 한다.
 } 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]);
}
profile
도전을 즐기는 자

0개의 댓글