[JS] 실패율

Yongmin Park·2024년 7월 22일
0

JS-Programmers

목록 보기
13/14

프로그래머스

게임 개발자 오렐리는 신규 사용자와 기존 사용자 간의 스테이지 차이를 줄이기 위해 한 가지 아이디어를 생각해냈습니다. 바로 실패율을 계산하여 난이도를 조절하겠다는 것이었죠. 오늘은 오렐리가 실패율을 계산하기 위해 작성한 코드를 하나씩 뜯어보면서 설명해 보려 합니다.

실패율이란?

먼저, 실패율에 대해 설명해드릴게요. 실패율은 특정 스테이지에 도달했지만 클리어하지 못한 사용자 수를 그 스테이지에 도달한 사용자 수로 나눈 값입니다. 예를 들어 스테이지 2까지 도달한 사용자가 10명이고, 그중 3명이 스테이지 2에서 멈췄다면, 스테이지 2의 실패율은 0.3이 됩니다.

문제 정의

문제는 주어진 전체 스테이지 수 N과 사용자가 각기 멈춰있는 스테이지 번호가 담긴 배열 stages가 주어졌을 때, 실패율이 높은 스테이지부터 내림차순으로 정렬한 배열을 반환하는 것입니다.

솔루션

코드를 통해 하나씩 살펴보겠습니다.

function solution(N, stages) {
    let answer = []
    let l = stages.length

먼저 solution 함수부터 시작해 볼게요. 이 함수는 전체 스테이지 수 N과 사용자들의 현재 스테이지 상태가 담긴 배열 stages를 인자로 받습니다. 우리는 결과를 담을 answer 배열을 하나 만들고, 배열 stages의 길이를 변수 l에 저장합니다. 이는 총 사용자 수를 의미합니다.

    for (let i = 1; i <= N; i++) {
        let reach = stages.filter(stage => stage >= i).length
        let fail = stages.filter(stage => stage === i).length
        answer.push([i, fail / reach])
    }

다음으로, 첫 번째 스테이지부터 마지막 스테이지까지 반복문을 돌며 각각의 실패율을 계산합니다.

  • reach는 해당 스테이지 이상에 도달한 사용자 수를 의미합니다. filter 메서드를 사용해 stages 배열에서 현재 스테이지 이상 도달한 사용자를 필터링한 후 그 길이를 구합니다.
  • fail은 해당 스테이지에서 멈춘 사용자의 수입니다. 역시 filter 메서드를 이용해서 현재 스테이지에 있는 사용자를 필터링한 후 그 길이를 구합니다.
  • answer 배열에 스테이지 번호와 실패율을 짝지어 추가합니다.
    answer.sort((a, b) => b[1] - a[1] || a[0] - b[0])
    return answer.map(a => a[0])
}

마지막 단계로, answer 배열을 실패율을 기준으로 내림차순 정렬합니다. 만약 실패율이 같다면, 스테이지 번호를 오름차순으로 정렬합니다. 이렇게 정렬된 후, map 메서드를 사용해 스테이지 번호만 추출하여 반환합니다.

코드 요약

  • 각 스테이지에 도달한 사용자와 그 스테이지에서 멈춘 사용자를 계산합니다.
  • 실패율을 계산하여 각 스테이지 번호와 함께 배열에 추가합니다.
  • 실패율을 기준으로 내림차순, 실패율이 동일하면 스테이지 번호 오름차순으로 정렬합니다.
  • 정렬된 스테이지 번호만 추출하여 반환합니다.

이렇게 해서 실패율을 기반으로 스테이지들을 효과적으로 정렬해냈습니다. 이 코드가 다양한 게임에서 난이도 조절에 어떻게 활용될 수 있을지 상상해보며 여러분들도 도전해보세요!

profile
기록으로 기적을

0개의 댓글