[프로그래머스 | Javascript] 2019 KAKAO BLIND RECRUITMENT - 실패율

박기영·2022년 9월 13일
0

프로그래머스

목록 보기
41/159
post-custom-banner

solution

function solution(N, stages) {
    // stages의 길이가 사용자 수, stages의 원소는 각 사용자가 멈춰있는 스테이지의 번호
    let failRateObj = {};
    
    for(let i = 1; i <= N; i++){
        let pass = 0;
        let left = 0;
        let failRate = 0;
        
        for(let j = 0; j < stages.length; j++){        
            // i번 스테이지에 도달한 사람의 수.
            // 주의 할 점은, 현재 i번 스테이지에 머물러 있는 사람도 여기 포함된다는 것이다.
            if(stages[j] >= i){
                pass++;
            }
            
            // 아직 i번 스테이지를 통과하지 못한 사람의 수
            if(stages[j] === i){
                left++;
            }
        }
         
        // 만약, i번 스테이지에 도달한 사람이 없다면 실패율은 0이 된다.   
        if(pass === 0){
            failRateObj[i] = failRate;
            
            continue;
        }
                    
        // 실패율        
        failRate = left / pass;
        
        // key - value 형태로 객체에 넣는다
        // 스테이지 번호(key) - 실패율(value)
        failRateObj[i]  = failRate;
    }
    
    
    let failRateArr = [];

    // sort를 사용하기 위해서 배열 형태로 전환
    for(let key in failRateObj){
        failRateArr.push([key, failRateObj[key]]);
    }
    
    failRateArr.sort((a, b) => {
        return b[1] - a[1];
    })
    
    let ans = [];
    
    for(let i = 0; i < failRateArr.length; i++){
        // key는 string 타입이므로 number 타입으로 변환해줘야한다.
        ans.push(Number(failRateArr[i][0]));
    }
    
    return ans;
}

음...굉장히 길어졌다. 40분정도 푼 것 같은데...
실패율을 내림차순 정렬하는게 아니라, 스테이지를 실패율에 따라 내림차순하는 것이기 때문에
그냥 배열에 넣어서 정렬하는 것으로는 코드가 꼬여버렸다.
객체의 key - value를 활용해서 스테이지 번호와 실패율을 한번에 접근할 수 있게 만들었다.
그 이후에는 다시 배열로 변환해서 정렬을 진행했다.
원하는 것은 스테이지의 번호이므로 key를 ans 배열에 넣어서 출력했다.

다른 분 풀이

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를 사용하셨다.
로직은 필자가 생각한 것과 동일한 것 같은데, 구현 방법이 훨씬 깔끔하다.
필자는 객체의 key - value를 사용했다면,
이 분은 2차원 배열을 사용하셨다.
1차원 배열에는 스테이지 번호와 실패율이 들어가있다.
2차원 배열의 정렬을 해서, 스테이지 번호만 추출해서 반환하신 것 같다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글