코딩테스트 문제풀이/programmers

프로그래머스 node.js - 실패율

sangchu 2024. 5. 29. 01:39

문제 링크

링크

 

풀이

function solution(N, stages) {
  var answer = [];
  let failValues = new Object();

  stages.sort((a, b) => a - b); // 오름차순 정렬

  let stageLength = stages.length; // 유저 수

  for (let i = 1; i <= N; i++) {
    let notClearStage = stages.filter((stage) => i === stage).length; // 스테이지에 도달했지만 클리어 못한 유저 수
    let failRetio; // 실패율

    if (notClearStage) failRetio = notClearStage / stageLength;
    else failRetio = 0; // 도달한 유저가 없는 경우 실패율 0

    failValues[i] = failRetio;
    stageLength -= notClearStage; // 그 다음 스테이지에 있는 유저 수
  }

  let sorted = Object.entries(failValues).sort((a, b) => b[1] - a[1]); // 실패율이 높은 순서대로 정렬

  sorted.forEach((x) => answer.push(Number(x[0]))); // 정렬된 배열의 스테이지 번호를 순서대로 답안 배열에 넣음

  return answer;
}

console.log(solution(5, [2, 1, 2, 6, 2, 4, 3, 3]));

 

문제 조건 분석

  • 전체 스테이지 수 : N
  • 실패율: (스테이지에 도달했지만 아직 클리어하지 못한 유저수)/(스테이지 도달 유저수)
  • stages: 각 사용자들이 현재 멈춰있는 스테이지 번호가 담긴 배열 (1 ~ N+1)
    • N+1은 모든 스테이지를 클리어한 유저
  • 구하고자 하는 것: 실패율이 높은 스테이지부터 내림차순으로 정렬된 배열
    • 실패율이 같으면 작은 번호의 스테이지 먼저
    • 스테이지에 도달한 유저가 없으면 실패율이 0

풀이 과정

  • 스테이지 번호를 key, 해당 스테이지 실패율을 value로 표현하기 위해 object 생성
  • 유저는 이전 스테이지를 클리어해야지 다음 스테이지로 갈 수 있으므로 낮은 스테이지 순서대로 정렬(stages를 오름차순으로 정렬)
  • for문으로 순회. 각 스테이지 실패율 구하고 해당 스테이지에 머무른 유저수는 제거 → 실패율 공식에서 스테이지 도달 유저수를 업데이트하기 위함
stages.filter((stage) => i === stage).length
  • 실패율을 구하고 앞서 만든 object에 해당 스테이지 번호와 실패율을 저장
  • 실패율 기준으로 내림차순 정렬
Object.entries(failValues).sort((a, b) => b[1] - a[1]);