프로그래머스 : 실패율 (level 1)

김진권·2021년 7월 26일

algorithm

목록 보기
4/10

<문제>


1. 나의 풀이

function solution(N, stages) {
    var answer = [];
    const failureRate = [];

    for (let i = 1; i <= N; i++) {
        failureRate.push([i,
            stages.filter(function (element) {
                if (element === i) return true;
            }).length /
                stages.filter(function (element) {
                if (element >= i) return true;
                }).length
        ]);
    }

    failureRate.sort(function(a,b) {
        return b[1]-a[1];
    })

    answer = failureRate.map(function(element) {
        return element[0];
    })

    return answer;
}

✳️ 풀이 과정 :

1️⃣ 단계별 실패율을 구한다.
실패율 ➡️ (stages 배열 내 i의 갯수 / stages 배열 내 i 이상의 수의 갯수)
2️⃣ failureRate배열안에 [단계,실패율]을 반복적으로 push 한다.
3️⃣ 실패율을 기준으로 sort()한다.
4️⃣ sort()된 배열의 각 요소의 첫번째 요소를 뽑아서 answer 만든다.
(map() 메소드 사용)


2. 고수의 풀이

function solution(N, stages) {
    let ans = []

    for (let i = 1; i <= N; ++i) {
        let usersReachedCurrentStage   = stages.reduce((acc, curStage) => acc + ((curStage >= i) ? 1 : 0), 0)
        let usersStagnatedCurrentStage = stages.reduce((acc, curStage) => acc + ((curStage == i) ? 1 : 0), 0)
        if (usersReachedCurrentStage === 0) {
            ans.push({ 'stage': i, 'failRate': 0 })
            continue
        }

        ans.push({ 'stage': i, 'failRate': (usersStagnatedCurrentStage / usersReachedCurrentStage) })
    }

    return ans.sort((a, b) => {
        if (a.failRate > b.failRate) return -1
        if (a.failRate < b.failRate) return 1
        return a.stage - b.stage
    }).map(entry => entry.stage)
}

✳️ 풀이과정 :

for문을 돌리고 sort()로 정렬하고 map()으로 스테이지 나열을 위한 새로운 배열을 뽑는 과정까지.. 거의 흡사하다.


출처 : https://programmers.co.kr/learn/courses/30/lessons/42889

profile
start!

0개의 댓글