[카카오] 실패율(프로그래머스)

정승옥(seungok)·2020년 12월 8일
0

프로그래머스

목록 보기
19/40
post-thumbnail

문제설명

  • 실패율: 스테이지에 도달했으나 클리어하지 못한 플레이어 수 / 스테이지에 도달한 플레이어 수
  • 전체 스테이지의 개수 N, 사용자가 현재 멈춰있는 스테이지 번호가 담긴 배열 stages
  • 각 스테이지의 번호를 실패율의 내림차순으로 정렬

제한사항

  • 스테이지의 개수 N은 1이상 500이하의 자연수
  • stages의 길이는 1이상 200,000이하
  • stages에는 1이상 N+1이하의 자연수가 담김
  • 각 자연수는 사용자 현재 도전중인 스테이지
  • N+1은 마지막 스테이지까지 클리어한 사용자
  • 실패율이 같은 스테이지가 있다면 오름차순 번호의 스테이지 정렬
  • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0

풀이

function solution(N, stages) {
    let result = [];
    let filterStages = stages.filter(stage=> stage !== 1);
    
    // 총 스테이지 개수만큼 반복
    for(let i=1;i<=N;i++){
        let count = 0;
        // 스테이지 1인 경우 초기 stages배열
        if(i === 1){
            for(let j=0;j<stages.length;j++){
                if(i === stages[j])
                    ++count;
            }
            result.push(count / stages.length);
        }
        // 그 외는 이전 스테이지를 제외한 stages배열
        else{
            filterStages = filterStages.filter(stage=> stage !== i-1);
            for(let j=0;j<filterStages.length;j++){
                if(filterStages[j] === i){
                    ++count;
                }
            }
            // 스테이지를 클리어한 사용자가 없다면 0
            // 그외 경우는 count / 이전 스테이지를 제외한 stages배열
            result.push(count / filterStages.length);
        }
    }
    // 각 스테이지 실패율을 담은 배열 result
    // 모든 사용자가 같은 스테이지일 경우
    if(result.filter(i=>i!==0).length === 1){
        // 실패율이 1인 스테이지 finalNum
        // finalNum을 배열을 첫번째로 넣고 나머지 스테이지는 오름차순으로 정렬
        let finalNum = result.indexOf(1) + 1;
        result = result.map((per,idx)=>{
            if(idx === 0)
                return per = finalNum;
            else
                return per = idx;
        })
        return result;
    }else{
        // result배열의 각 원소에 idx+1(스테이지)를 합쳐 배열로 반환
        // 확률을 비교하여 내림차순 정렬 후 스테이지만 다시 반환
        result = result.map((per,idx)=>[per,idx+1]).sort((a,b)=>b[0]-a[0])
        .map(per=>per[1]);
        return result;
    }
}
profile
Front-End Developer 😁

0개의 댓글