

function solution(N, stages) {
// 배열 stages를 객체로 표현
const obj = {};
// 객체의 key는 1부터 N+1까지, value는 일단 0으로
for (let i = 1; i <= N + 1; i++) {
obj[i] = 0;
}
// 해당 stage당 멈춰있는 사람의 수 value로
for (let i = 0; i < stages.length; i++) {
// value가 0이면 1로 설정, 이미 1 이상이라면 +1
if (obj[stages[i]] === 0) {
obj[stages[i]] = 1;
} else {
obj[stages[i]] += 1;
}
}
// 실패율 담을 객체 만들기
const rate = {};
// 실패율을 구할 때 분모의 값
let total = stages.length;
for (let i = 1; i <= N + 1; i++) {
rate[i] = obj[i] / total;
total = total - obj[i];
}
// 실패율 담은 객체를 내림차순하도록
const sorted = Object.entries(rate).sort((a, b) => b[1] - a[1]);
const result = [];
for (let e of sorted) {
result.push(Number(e[0]));
}
// N+1단계는 클리어한 사람이기 때문에 N단계까지만 반환하도록
return result.filter((x) => x <= N);
}
stages 배열을 객체로 만들었다. 모든 스테이지를 클리어한 경우 N+1이기 때문에 객체의 key를 1부터 N+1 까지 만들었다. value로는 일단 0을 담아두었다. 해당 스테이지에 멈춰있는 사람의 수 / 스테이지에 도달한 플레이어의 수 이기 때문에 분모를 계산하기 위하여 일단 배열의 길이만큼 total이라는 변수에 할당하였다. total이라는 변수는 배열을 순회하면서 값이 변할 수 있게 하였다. filter 메소드를 사용하였다. 4번에서 조금 시간을 지체하였다. 처음부터 다른 방법으로 풀었다면 고민하지 않았을 것 같았는데 이미 여기까지 코드를 작성했으니 내림차순으로 어떻게든 반환하여야 했다. 이를 위해 구글링하였고, 괜찮은 방법들을 찾아 내 코드에 적용하였다. 이와 관련된 내용은 뒤에서 작성하도록 하겠다.
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]);
}
...
또 현타만...
오는...
다른 사람의 풀이...
for 문에서 저렇게 filter 메서드를 사용할 방법을 생각하지 못했다. 와 진짜 저렇게 간단하게 할 수 있다니.... 객체를 이용하는 게 아니라 배열로 답을 찾아낼 수 있었다니... 그럼 객체의 value에 따라 내림차순으로 정렬할 방법을 찾지 않아도 되었잖아...! 왜 객체를 고집했을까 나는.... 하지만... 덕분에 하나 배울 수 있어서 ... 다행이다... ^^...
이 문제의 첫 번째 입출력 예를 사용하여 설명하겠다.
key는 사용자가 현재 멈춰있는 스테이지의 번호, value는 스테이지의 실패율이다.
{
1: 0.125,
2: 0.42857142857142855,
3: 0.5,
4: 0.5,
5: 0
}
실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return하기 위해서는 객체의 value로 정렬하여 그 key를 배열로 반환하여야 한다.
구글링을 통해 스택오버플로우와 블로그에서 방법을 찾았는데 내가 사용한 방법은 아래와 같다.
// rate = { 1: 0.125, 2: 0.42857142857142855, 3: 0.5, 4: 0.5, 5: 0 }
const sorted = Object.entries(rate).sort((a, b) => b[1] - a[1]);
const result = [];
for (let e of sorted) {
result.push(Number(e[0]));
}
console.log(result)
Object.entries() 메서드를 사용하여 [key, value] 쌍의 배열을 만들고, 여기에 sort() 메서드를 사용하여 객체의 value 값을 내림차순으로 반환할 수 있도록 선언해두었다.
그 후, 객체의 value를 기준으로 내림차순으로 정렬된 [key, value]가 담긴 배열 중 key값만 새로운 배열에 담을 수 있도록 for문을 만들었다.
이렇게 글로 설명하고, 블로그를 작성하고 나니 굉장히 쉬운 것이었는데 문제를 푸는 순간에는 생각해내지 못했다는 게 많이 아쉽다. 내 것으로 만들 수 있도록 더 노력해야겠다.