본문 바로가기
Algorithm/프로그래머스[Programmers]

[JS] 2019카카오 : 실패율 프로그래머스 LEVEL1

by jgo 2022. 6. 30.

문제 링크

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]);
}

 

더 좋은 방법이나 의견이 있으시다면 댓글 부탁드립니다 :)

댓글