문제 링크
풀이
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]);
-
- Object.entries: [키, 값] 쌍을 담은 배열을 반환
'코딩테스트 문제풀이 > programmers' 카테고리의 다른 글
프로그래머스 node.js - 신규 아이디 추천 (0) | 2024.06.07 |
---|---|
프로그래머스 node.js - 성격 유형 검사하기 (1) | 2024.06.06 |
프로그래머스 node.js - 키패드 누르기 (0) | 2024.06.05 |
프로그래머스 node.js - [1차] 비밀지도 (0) | 2024.05.27 |
프로그래머스 node.js - 숫자 문자열과 영단어 (0) | 2024.05.27 |