문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42889
풀이 전략
실패율은 다음과 같이 정의한다.
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
tages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
- 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
- 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
코드
function solution(N, stages) {
const answer = [];
const arr = [];
let idx = 0;
let len = stages.length;
stages.sort((a, b) => a - b);
for (let i = 1; i <= N; i++) {
let cnt = 0;
while (idx < stages.length) {
if (i === stages[idx]) {
idx++;
cnt++;
} else break;
}
arr.push([i, cnt / len]);
len -= cnt;
}
arr.sort((a, b) => {
if (a[1] === b[1]) return a[0] - b[0];
else return b[1] - a[1];
});
for (const [f, s] of arr) {
answer.push(f);
}
return answer;
}
회고
전체적인 로직과 구현은 얼추 맞는 방향으로 코드를 작성하였지만, 세세한 부분에서 중첩이 일어나는 부분을 제출하고 나서 리뷰를 하는 도중에 발견하였다.
첫번째 sort부분
arr.sort((a, b) => {
if (a[1] === b[1]) return a[0] - b[0];
else return b[1] - a[1];
});
나는 이렇게 작성하여 만약에 실패율이 같다면 오름차순으로 정렬하도록 하였는데 이미 위의 for문 에서 1부터 N까지 arr에 push를 하였기 때문에 오름차순으로 정렬된 상태다. 그러므로
arr.sort((a, b) => b[1] - a[1]);
이렇게만 작성하면 된다.
두번째 answer return 문. 나는 arr와 answer 배열 두개를 사용하였지만 작성을 할 때도
for (const [f, s] of arr) {
answer.push(f);
}
이부분이 찝찝하여 다른 방법을 생각하였는데 제출할 당시에는 생각나지 않아 임시로 제출하였다. 하지만 배열을 두개 사용하는 것은 공간을 많이 차지하여서 생각해낸다른 방법이 바로 map 메서드를 사용하는 것이다.
arr에 push를 하고 return을 할 때
return arr.map((v) => v[0]);
이렇게 작성하여 return 하면 배열을 굳이 하나 더 만들필요가 없다. map함수는 반환값으로 새로운 배열을 반환하기 때문에 가능한 일이다. 사실 위의 코드와 다른 점은 거의 없지만 이렇게 메서드를 이용하는 것이 더 가독성이 좋아보여서 이처럼 개선하게 되었다.
최종 코드
function solution(N, stages) {
const arr = [];
let idx = 0;
let len = stages.length;
stages.sort((a, b) => a - b);
for (let i = 1; i <= N; i++) {
let cnt = 0;
while (idx < stages.length) {
if (i === stages[idx]) {
idx++;
cnt++;
} else break;
}
arr.push([i, cnt / len]);
len -= cnt;
}
arr.sort((a, b) => b[1] - a[1]);
return arr.map((v) => v[0]);
}
더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)
'Algorithm > 프로그래머스[Programmers]' 카테고리의 다른 글
[JS] 2020카카오 : 키패드 누르기 프로그래머스 LEVEL1 (0) | 2022.06.26 |
---|---|
[JS] 2021Dev-Matching : 로또의 최고 순위와 최저 순위 프로그래머스 LEVEL1 (0) | 2022.06.24 |
[JS] 2022카카오 : 신고 결과 받기 프로그래머스 LEVEL2 (0) | 2022.06.23 |
[JS] 2020카카오 : 수식 최대화 프로그래머스 LEVEL2 (0) | 2022.06.22 |
[JS] 2020카카오 : 괄호 변환 프로그래머스 LEVEL2 (0) | 2022.06.21 |
댓글