알고리즘/test

javascript) 프로그래머스 - 실패율

이경찬 :) 2023. 2. 20. 13:23

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

실행코드

function solution(N, stages) {
    var clearRate = [];
    var cnt = 0;
    var allcnt = 0;
    for(let i = 1; i < N + 1; i++){
        for(let j = 0;j < stages.length; j++){
              if(stages[j] >= i){
                  allcnt += 1;
              }
              if(stages[j] === i){
                  cnt += 1;
              }
        }
        clearRate.push(cnt / allcnt)
        cnt = 0;
        allcnt = 0;
    }
    const sortedArr = clearRate
      .map((value, index) => [value, index+1])
      .sort((a,b) => b[0] - a[0]);

    const resultArr = sortedArr
      .map(pair => pair[1]);
    return resultArr;
}

풀이

먼저 for문으로 i를 stage라고 생각하고 allcnt(전체에서 해당스테이지 이상.즉 분모)와 cnt(해당 stage를 아직 clear하지못한 인원 cnt)를 구해서 clearRate에 push해주었습니다.

 

이제 clearRate에는 실패율이 소수형태로 저장되어있습니다.

value와 index+1(stage는 1부터라서)로 나누어서 map과 sort를 진행을 하였습니다 

 

그리고 sort해준 sortedArr를 가지고 index만으로 정렬을 해주어야 하니까 map을 이용해 1번쨰요소인 index로 새로운 resultArr를 만들어 return해주었습니다.

 

더 개선된 풀이

function solution(N, stages) {
    const clearRate = new Array(N).fill(0);
    let allcnt = stages.length;
    
    stages.forEach(stage => {
        if (stage <= N) {
            clearRate[stage - 1]++;
        }
    });

    clearRate.forEach((count, index) => {
        const failureRate = count / allcnt;
        clearRate[index] = [failureRate, index + 1];
        allcnt -= count;
    });
    
    clearRate.sort((a, b) => b[0] - a[0]);
    return clearRate.map(pair => pair[1]);
}

1. 각 단계에 대해 stages배열을 반복하는 대신 배열을 사용하여 각 단계를 클리어한 플레이어 수를 추적하여 코드를 더 효율적으로 만들어 줬습니다.

2. 또한 일부 불필요한 변수와 루프를 제거하여 코드를 단순화 해줬습니다.

3. 이 코드는 'clearRate' 배열에 대해 0 기반 인덱스를 사용한 다음 최종 결과 배열의 각 인덱스에 1을 추가합니다. 코드 전체에서 1부터 시작하는 인덱스를 사용하려면 그에따라 코드를 조정하면 됩니다.