Notice
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Today
Total
관리 메뉴

차차로그

[JS] 2019 KAKAO BLIND RECRUITMENT > 실패율 본문

코딩테스트

[JS] 2019 KAKAO BLIND RECRUITMENT > 실패율

차차한 2022. 9. 5. 13:51

function solution(N, stages) {
    var answer = new Array(N).fill(0); //[ 0, 0, 0, 0, 0 ]
    
    //유저 수
    var user = stages.length;
    
    stages = stages.sort((a,b)=>a-b);    

    var map = new Map();
    answer.map((v,i)=>{      
        map.set(i+1, v);        
    })
    //	Map(5) { 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0 }

    stages.map((v,i)=>{
        map.set(v, (map.get(v)||0)+1);
    })
    //	Map(6) { 1 => 1, 2 => 3, 3 => 2, 4 => 1, 5 => 0, 6 => 1 }
    
    var arr = [...map];
    arr.map((v,i)=>{
        
        var num = arr[i][1];
        arr[i][1] = arr[i][1] / user;
        user -= num;
    })
    
    answer = arr.sort((a,b)=>b[1]-a[1]);
    var arr2 = [];
    
    for(var [v,z] of answer){

        if(v <= N){
            arr2.push(v);
        }
    }
    return arr2;
}

map의 key를 단계로 두고 value에 실패율을 넣었다.

스테이지는 5단계인데 실패율이 0인 단계가 있으면 stages 배열에 나오지 않아서 이 부분이 좀 어렵고 헷갈렸다.

var answer = new Array(N).fill(0); //[ 0, 0, 0, 0, 0 ]

var user = stages.length;
    
stages = stages.sort((a,b)=>a-b);

먼저 스테이지 수만큼 길이를 가진 배열을 하나 만들었다.

실패율이 0인 단계 값을 넣어주기 위해 미리 값을 만들어 놓음

stages배열의 길이는 곧 유저의 수니까 미리 변수에 담아놓고, stages는 오름차순으로 정렬해줬다(보기 편하려고..)

var map = new Map();
    answer.map((v,i)=>{      
        map.set(i+1, v);        
    })
//	Map(5) { 1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0 }

map을 생성하고 answer를 돌려 map도 스테이지 수만큼 만들어줬다.

 stages.map((v,i)=>{
        map.set(v, (map.get(v)||0)+1);
    })
//	Map(6) { 1 => 1, 2 => 3, 3 => 2, 4 => 1, 5 => 0, 6 => 1 }

그리고 단계별 실패한 회원의 수가 담겨있는 배열 stages를 돌려 map에 수를 더해줬다.

var arr = [...map];
//	[ [ 1, 1 ], [ 2, 3 ], [ 3, 2 ], [ 4, 1 ], [ 5, 0 ], [ 6, 1 ] ]
    arr.map((v,i)=>{
        
        var num = arr[i][1];
        arr[i][1] = arr[i][1] / user;
        user -= num;
    })
/*
[
  [ 1, 0.125 ],
  [ 2, 0.42857142857142855 ],
  [ 3, 0.5 ],
  [ 4, 0.5 ],
  [ 5, 0 ],
  [ 6, 1 ]
]
*/
answer = arr.sort((a,b)=>b[1]-a[1]);
/*
[
  [ 6, 1 ],
  [ 3, 0.5 ],
  [ 4, 0.5 ],
  [ 2, 0.42857142857142855 ],
  [ 1, 0.125 ],
  [ 5, 0 ]
]
*/

map을 배열에 담아주고 arr[i][1]부분에 실패율을 계산해 담아줬다.

그리고 내림차순으로 정렬을 할 때 1번 인덱스에 있는 값(실패율)을 기준으로 내림차순을 해줬다.

var arr2 = [];
    
    for(var [v,z] of answer){

        if(v <= N){
            arr2.push(v);
        }
    }

마지막으로 v즉 스테이지가 주어진 스테이지 수보다 같거나 작은 경우에만 arr2 배열에 담아줬다.

N이 5인데 stages배열에는 6단계(모두 통과한 유저)가 있기 때문이다.

 

function solution(N, stages) {
    let result = [];
    for(let i=1; i<=N; i++){
        let reach = stages.filter((x) => x >= i).length;
        // 8, 7, 4, 2, 1
        let curr = stages.filter((x) => x === i).length;
        // 1, 3, 2, 1, 0
        result.push([i, curr/reach]);
    }
    /*
    	[
          [ 1, 0.125 ],
          [ 2, 0.42857142857142855 ],
          [ 3, 0.5 ],
          [ 4, 0.5 ],
          [ 5, 0 ]
        ]
    */
    result.sort((a,b) => b[1] - a[1]);
    return result.map((x) => x[0]);
}

다른 사람 풀이

N(스테이지 수)만큼 반복문을 돌려서

reach 변수에는 각 단계에 도달한 사람의 수, curr에는 해당 스테이지에 머물러있는 유저 수를 담았다.

배열에 [ i (단계), curr/reach(실패율) ] 을 넣어줬고, 실패율을 기준으로 내림차순을 한 뒤에 단계만 리턴을 해줬다.

완전 깔끔하고 이해도 잘 되는 코드다.

filter 사용할 생각은 1도 못 했는데 이번 기회에 배우게 됐다.

Comments