[프로그래머스] 실패율😂

GoGoDev·2021년 7월 1일
0

Programmers Lv.1🌱

목록 보기
45/46

https://programmers.co.kr/learn/courses/30/lessons/42889

나의 코드

function solution(N, stages) {
    let answer = [];
    let failure = 0;
    let failMan = 0;
    let player = stages.length;
    for(let j = 1; j < N+1; j++){
        for(let i = 0; i < stages.length; i++){
            if(stages[i] === j){
                failMan++;
            }
            failure = 0;
        }
        failure = failMan / player;
        answer.push({index:j, failure:failure});
        player -= failMan;
        failMan = 0;
    }
    answer.sort((a,b) => {
        if(a.failure > b.failure)
            return -1;
        else if(a.failure == b.failure)
            return 0;
        else 
            return 1;        
    })
    return answer.map(e => e.index);
}

처음 시도

  1. temp 배열을 새로 만들어 각 단계별 실패율의 값을 넣고 temp.sort((a-b) => b-a)를 했다.
  2. js에서 Array.sort()를 하면 기존의 있던 배열은 사라지고 정렬된 배열이 입력된다.
  3. 그래서 sort()를 한 배열과 기존 배열을 비교해도 정렬된 배열만 존재하기 때문에 비교하는 의미가 사라진다.
  4. answer 배열에 기존 배열을 넣고 temp 배열은 정렬을 하여 temp 배열의 값과 answer 배열의 값을 비교하여 answer의 해당 값의 index 값을 찾으려했지만, 중복되는 실패율에서 오류가 났다.
  5. 각 인덱스의 실패율이 같은 값이 있따면 맨 앞에 있는 인덱스의 값만 출력되는 오류이다.
    (예제 1번과 같이 스테이지 3,4가 실패율이 같아 indexOf로 인덱스 값을 추출하면 3만 나온다.)

다음 시도

  1. 저장할 때, 객체형태로 저장을 한다.
  2. key: index값 value: 실패율 값을 넣는다
  3. 정렬을 할 때, 먼저 온 실패율과 나중에 비교할 실패율을 비교하여 정렬을 한다.
  4. map을 이용하여 index값만 출력한다.

실패한 것들

  1. map으로 객체 만들기
  2. iterator로 시도해보기

1단계 문제들을 풀면서 정렬 문제가 많다고 느꼈다.
그 중 오름차순, 내림차순, 배열 값 비교가 있는데 Array.sort((a,b) => ???) 에서
???안에 들어가는 코드를 잘 짜야겠다고 느꼈다. a는 먼저 오는 값, b는 나중에 오는 값으로
a, b를 비교하여 return 1,0,-1을 잘 반환해야겠다.

다른 분의 풀이

(sso님의 velog에서)

// 객체 이용 X
function solution(N,stages) {
    var answer = [],
        result = [];
    for(var i =0; i < N; i++) {
        var a = stages.filter(word => word >= i+1).length;
        var b = stages.filter(word => word == i+1).length;
        if( b===0){
            result.push(0);
        }else {
        result.push(b/a);
        }
    }
    for(var i =0; i < N; i++) {
        var index = result.indexOf(Math.max.apply(null, result));
        answer.push(index+1); //answer[i] = index+1;도 가능
        result[index] = -1;
    }
    return answer;
}

filter을 이용하여 코드의 양이 확 줄어들었다..
result 배열(실패율 값이 들어가 있는 배열)에서 최대값의 index 값을 찾아 answer에 넣고
최대값을 -1로 만들어 제외 시킨다.
배열에 배열을 붙이기 위해 apply사용
Math.max.apply

profile
🐣차근차근 무럭무럭🐣

0개의 댓글