코딩테스트 #35 실패율 (2019 카카오 블라인드채용 문제)

Jake Seo·2020년 7월 15일
1

프로그래머스 LV1

목록 보기
35/36

문제

풀이

풀이의 핵심은 실패율 계산과 정렬입니다.

실패율 계산의 공식은 저의 경우에는 1-성공/도전으로 정의했습니다. 1-성공률 = 실패율

성공의 횟수는 현재 스테이지가 해당 스테이지보다 높은 사람들의 숫자이며, 도전의 횟수는 현재 스테이지가 해당 스테이지보다 같거나 높은 사람들입니다. (일단 그 스테이지를 한번 거친 사람)

성공과 도전을 이용해서 성공률을 구해주면 되는데, 여기서 중요하게 생각해야 할 예외처리가 하나 있습니다. 바로 어떤 숫자를 0으로 나누면 안된다는 것인데요. 그래서 저는 아래 코드에서 challenger !== 0 ? clear / challenger : 1와 같은 예외처리를 해주었습니다.

값 반환 시에 인덱스 번호와 실패율을 함께 반환하고 실패율을 내림차순으로 정렬하고 실패율이 같다면 인덱스 번호가 작은것 순으로 정렬하게 했습니다.

사실 실패율을 따로 계산 안하고 성공률의 오름차순으로 정렬해도 같은 결과를 얻을 것 같습니다.

그 이후에는 map메소드를 이용해서 인덱스 번호만 따로 빼주었습니다.

let solution = (n, stages) => Array(n).fill(0).map((e, i) => {
    let clear = 0;
    let challenger = 0;
    let currentStage = i+1;

    for(let stage of stages){
        if(stage > currentStage)
            clear += 1;
        if(stage >= currentStage)
            challenger += 1;
    }

    let successRatio = challenger !== 0 ? clear / challenger : 1;
    return [1 - successRatio, currentStage];
}).sort((b, a) => a[0] !== b[0] ? a[0] - b[0] : b[1] - a[1]).map(e=>e[1]);
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글