[프로그래머스] 실패율

리아·2021년 2월 6일
0

Algorithm

목록 보기
2/2

프로그래머스 레벨1 다 풀기, 그 두번째 문제이다.
이해력이 부족한 것인지.. 문제를 이해하는데 다소 시간이 소요됐다. 😭

문제는 다음과 같다.

문제 해석

  1. 주어진 배열을 순회한다.
  2. 주어진 배열에서 N번째 스테이지에서 멈춘 유저들을 필터링한다.
  3. 새로운 data 라는 배열에 필터링 된 유저와 전체 배열의 길이를 나누어 실패율을 구하고, 인덱스 값도 저장해서 객체 형식으로 넣는다.
  4. 해당 유저들은 더 이상 필요하지 않으므로 주어진 배열에서 제거한다.
  5. 이 때 N번째 스테이지에서 멈추지 않은 유저가 있을 경우 0으로 처리하고 넘어간다.
  6. 1~5까지의 과정을 거치면 data배열은 완성되고 이 배열을 가지고 정렬을 한다.
  7. 기본적으로는 score의 순위를 비교하지만 같은 스코어일 경우 index가 낮은 순으로 재 정렬한다.
  8. 마지막으로 index값만 담긴 배열을 리턴한다.

에러 핸들링

 1. 필터 메소드를 잘못 사용하여 푸쉬를 한 이후에 해당 유저들을 제거하지 못했다.
 2. 특정한 스테이지에서 누구도 실패하지 않았을 가능성이 있는데 미처 인지하지 못하고 이 예외처리를 적용하는데 시간이 제일 많이 소요됐다.

코드 전문

function solution(N, stages) {
    var answer = [];
    let data = []
    for(let i = 1; i <= N; i++) {
        let users = stages.filter(user => user === i)
        if(users.length === 0) {
            data.push({ score: 0, index: i})
            continue
        }
        data.push({ score: users.length / stages.length, index: i})
        stages = stages.filter(user => user !== i)
    }
    data.sort((a, b) => {
        if(a.score === b.score) {
            if(a.index > b.index) return 1
            else return -1
        }
        if(a.score < b.score) return 1
        else return -1
    })
    return data.map(user => user.index)
}

개선해야 할 점

  1. 평균적인 실행속도는 모르겠지만 테스트 케이스에서 가장 높은 수치는 2500ms 였다.
    아무래도 순회하는 메소드가 많은 것 같아 개선해야 될 부분이다.
  2. 코드 이야기는 아니지만 문제를 더 꼼꼼히 살필 필요가 있을 것 같다. (에러핸들링 2번)

전부 주관적인 관점에서 회고하며 작성된 내용 입니다.

profile
초보 개발자 블로그

0개의 댓글