[프로그래머스, js] 실패율

이다형·2023년 7월 11일
0

문제 설명


슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

  • 실패율은 다음과 같이 정의한다.
    * 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

나의 풀이

function solution(N, stages) {  
    let left = {}; // 도달했지만 클리어하지 못한 플레이어 수
    let count = {}; // 스테이지에 도달한 플레이어 수
    let rate={} // left/count
    
    // 각 딕셔너리 초기화
    for (let i = 1; i <= N; i++) {
        left[i] = 0;
        count[i] = 0;
        rate[i] = 0;
    }   
    
    // 각 stages 할당
    for(let i = 0; i < stages.length; i++){
        left[stages[i]]++;        
        for(let j = 1;j <= stages[i];j++){
            count[j]++
        }
    }
    
    // rate에 left/count 할당
    for(let i = 1; i <= N; i++){
        rate[i] = left[i] / count[i]
    }
    
    console.log(rate)
    // rate key들의 내림차순 sort
    let keys = Object.keys(rate).sort((a, b) => rate[b] - rate[a]);

    return keys.map(Number);

}
  1. 실패율(rate)은 해당 스테이지를 못깨고 머룰러있는 사람 (left) / 해당 스테이지에 도달한 사람 (count) 로 정의한다.

  2. stages[i]가 등장할때마다 left[i]를 증가시키고
    count[i]는 1부터 i까지 전부 1씩 증가시킨다.

  3. left[i]/count[i]를 rate[i]에 할당한다.

    { '1': 0.125, '2': 0.42857142857142855, '3': 0.5, '4': 0.5, '5': 0 }

    각 스테이지별 실패율이 rate에 저장되는걸 볼 수 있다.

  4. 이제 실패율 value를 가진 스테이지 key들을 정렬한 배열을 생성한다.

let keys = Object.keys(rate).sort((a, b) => rate[b] - rate[a]);
  1. key배열은 문자열이므로 Number 타입으로 map된 배열을 return 한다.

다른 사람의 풀이

function solution(N, stages) {
    let result = [];
    for(let i=1; i<=N; i++){
        let reach = stages.filter((x) => x >= i).length;
        let curr = stages.filter((x) => x === i).length;
        result.push([i, curr/reach]);
    }
    result.sort((a,b) => b[1] - a[1]);
    return result.map((x) => x[0]);
}

기본적인 알고리즘 구성은 동일하지만 filter함수를 사용하여 더 가독성있고 간결한 코드 구성이다.

filter 함수에 대해서 공부하자.

0개의 댓글