차차로그
[JS] 2019 KAKAO BLIND RECRUITMENT > 실패율 본문
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도 못 했는데 이번 기회에 배우게 됐다.

'코딩테스트' 카테고리의 다른 글
[JS] 2020 카카오 인턴십 > 키패드 누르기 (0) | 2022.09.07 |
---|---|
[JS] 2019 카카오 개발자 겨울 인턴십 > 크레인 인형뽑기 게임 (0) | 2022.09.06 |
[JS] 2018 KAKAO BLIND RECRUITMENT[1차] > 다트 게임 (0) | 2022.09.02 |
[JS] 탐욕법(Greedy) > 체육복 (0) | 2022.08.31 |
[JS] 연습문제 > 정수 제곱근 판별 (0) | 2022.08.29 |
Comments