게임 개발자 오렐리는 신규 사용자와 기존 사용자 간의 스테이지 차이를 줄이기 위해 한 가지 아이디어를 생각해냈습니다. 바로 실패율을 계산하여 난이도를 조절하겠다는 것이었죠. 오늘은 오렐리가 실패율을 계산하기 위해 작성한 코드를 하나씩 뜯어보면서 설명해 보려 합니다.
먼저, 실패율에 대해 설명해드릴게요. 실패율은 특정 스테이지에 도달했지만 클리어하지 못한 사용자 수를 그 스테이지에 도달한 사용자 수로 나눈 값입니다. 예를 들어 스테이지 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
메서드를 사용해 스테이지 번호만 추출하여 반환합니다.
이렇게 해서 실패율을 기반으로 스테이지들을 효과적으로 정렬해냈습니다. 이 코드가 다양한 게임에서 난이도 조절에 어떻게 활용될 수 있을지 상상해보며 여러분들도 도전해보세요!