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차원 배열의 정렬을 해서, 스테이지 번호만 추출해서 반환하신 것 같다.