슬슬 코드가 길어지는 듯 싶다.
그간 짧게 마무리가되서 긴 코드를 적기 좀 부담스러운? 느낌이 있었는데 그런 생각을 버려야 할듯
이 문제의 핵심은 object 자료형을 쓰느냐 마느냐인 것 같기도하다.
배열에 0을 채운채로 만들어 각 스테이지마다 플레이어의 수를 구해놓는다. => 실패율을 구할 때 사용
failureReates에 object를 넣는게 아닌 배열에 실패율 따로 스테이지 따로 하려다보니까 잘 생각이 안났었는데 object를 이용하고나서 술술 풀어졌음.
function solution(N, stages) {
let playersAtStage = new Array(N + 1).fill(0);
let failureRates = [];
stages.forEach(stage => {
if (stage <= N) {
playersAtStage[stage]++;
}
});
let totalPlayers = stages.length;
for (let i = 1; i <= N; i++) {
if (totalPlayers > 0) {
let failureRate = playersAtStage[i] / totalPlayers;
failureRates.push({ stage: i, failureRate: failureRate });
totalPlayers -= playersAtStage[i];
} else {
failureRates.push({ stage: i, failureRate: 0 });
}
}
failureRates.sort((a, b) => {
if (b.failureRate === a.failureRate) {
return a.stage - b.stage;
}
return b.failureRate - a.failureRate;
});
return failureRates.map(item => item.stage);
}
충격적인건 이 코드가 아래처럼 짧아질 수도 있다는 것;
1. reach = 1스테이지보다 x가 크거나 같아? 해당 스테이지이거나 지나간 사람
2. cuur = 1스테이지와 똑같아? 해당 스테이지인 사람
3. 위의 두 정보로 실패율과 스테이지를 각각 배열에 넣어서 result 배열에 푸쉬
4. 솔트 후 스테이지만 출력 키햐..므야이거
하지만 시간 복잡도가 O(N * log n)이라 큰 작업을 하게된다면 성능이 좋지아늠 ㅇㅇ..
짧다고 다 좋은 것은 아니지만 이렇게 생각 할 수 있도록 노력해야겠다싶긴하네
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]);
}