프로그래머스 #JS - 실패율

SSO·2020년 1월 17일
0

프로그래머스Lv1

목록 보기
38/47
post-custom-banner

문제

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

풀이

성공코드(다른 사람의 풀이)

// 객체 이용 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;
}
  
// 객체 이용
function solution(N, stages){
  var answer = [];
  for( let i=1; i<=N; i++ ){
    let top = stages.filter(el=>(el===i)).length;
    let bottom =  stages.filter(el=>(el>=i)).length;

    if(bottom === 0){
          answer.push({stageNumber:i, failRate: 0 });
    }else{
        answer.push({stageNumber:i, failRate: top / bottom });
    }
  }

  return answer.sort((a,b)=>(b.failRate === a.failRate) ? a.stageNumber -b.stageNumber : b.failRate - a.failRate).map(el=>el.stageNumber);
}
생각해보기 40mins -> 3H를 sort로 허비

ㅠㅠ시간이 너~무 오래 걸림... 기본적인 sort함수에서 비교부분을 놓침...
 다른 사람의 풀이를 보니까 기본적으로 배열 안에 객체를 할당했어야 -> index, value를 따로 비교 기준으로 잡아야 하니까 => 내 방법도 틀린 건 아님
 왜 틀렸? push, 배열 할당같은 거엔 문제 없었음. 단지 sort method에서 두 값이 같은 경우 오름차순으로 나타내는 걸 고려하지 않음. Q 왜 값이 같을 때 answer.sort((a,b)=>rate[b]-rate[a])만으로 충분하지 않지? =>
 1. sort비교가 순차적이지 않을 수도 있음
 2. 주어진 배열이 순차적일 때만 제대로 작동하는 함수는 불완전한 것. 어떤 배열이 주어져도 제대로 동작하는 함수를 만들어야.

처음 실패코드 - 48.1%


function solution(N, stages) {
    var answer = [];
    var top = [];
    var bottom = [];
    var rate = [];
  
    for(var i=0; i<N; i++){
      top[i] = stages.filter(el => (el === i+1)).length;
      bottom[i] = stages.filter(el => (el >= i+1)).length;
      answer[i]=i;
      rate[i] = top[i] /bottom[i];
      if(bottom[i] === 0){
        rate[i] = 0;
      }
    } //top, bottom은 배열에 선언할 필요 없음. rate값을 rate 배열에 넣으면 됨. 지나치게 많은 배열 선언.

    answer.sort((a,b)=>rate[b]-rate[a]); //문제였던 부분ㅠㅠ
  //옳은 코드:answer.sort((a,b)=>rate[b]===rate[a]? a-b : rate[b]-rate[a]); 

    for(var i=0; i<N;i++){
        answer[i] = answer[i] +1;
    }
  
    return answer;
}
//성공
function solution(N, stages) {
    var answer = [];
    var rate = [];
  
    for(var i=0; i<N; i++){
      var top = stages.filter(el => (el === i+1)).length;
      var bottom = stages.filter(el => (el >= i+1)).length;
      answer[i]=i;
      rate[i] = top /bottom;
      if(bottom === 0){
        rate[i] = 0;
      }
    } 
  
  answer.sort((a,b)=>rate[b]===rate[a]? a-b : rate[b]-rate[a]); 

    for(var i=0; i<N;i++){
        answer[i] = answer[i] +1;
    }
  
    return answer;
}

참고사항

array.sort() method!!! 두 값이 같은 경우...ㅠㅠ

profile
happy
post-custom-banner

0개의 댓글