Programmers.js - 실패율

박요셉·2024년 6월 11일
0

Programmers.Js

목록 보기
23/26
post-custom-banner


슬슬 코드가 길어지는 듯 싶다.
그간 짧게 마무리가되서 긴 코드를 적기 좀 부담스러운? 느낌이 있었는데 그런 생각을 버려야 할듯

이 문제의 핵심은 object 자료형을 쓰느냐 마느냐인 것 같기도하다.

  1. 배열에 0을 채운채로 만들어 각 스테이지마다 플레이어의 수를 구해놓는다. => 실패율을 구할 때 사용

  2. 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]);
}
profile
개발자 지망생
post-custom-banner

0개의 댓글