[Lv1]실패율

Creating the dots·2022년 1월 3일
1

Algorithm

목록 보기
42/65
post-custom-banner

프로그래머스

나의 풀이

수도코드

  • 실패율은 스테이지에 도달했으나 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    • 예를 들어, 2단계 실패율은 1단계는 통과했으나 2단계에서 떨어진 플레이어 수 / 2단계부터 마지막 단계 통과한 플레이어 수이다.
  • N은 단계의 개수를 의미하고, stages는 게임에 참여한 각 플레이어들이 탈락한 단계가 요소이다.
  • totalNum = stages.length
  • arr은 새로운 배열
  • 1단계부터 N단계까지 반복문을 돌면서
    • 각 단계에서 떨어진 플레이어를 필터링해 인원을 구한다.
    • 떨어진 인원이 0명이라면 실패율은 0
    • 떨어진 인원이 0이 아니라면 실패율은 떨어진 인원/totalNum
    • totalNum에서 떨어진 인원만큼 빼준다.
    • arr.push({idx: i, ratio: 실패율}) 👉 단계와 실패율을 하나의 객체로 저장해 배열에 푸시한다.
  • 반복문이 끝나면 배열 arr에는 각 단계별 실패율이 객체형태로 저장된다.
  • arr의 실패율을 sort를 사용해 내림차순으로 정렬하고, 실패율이 같다면 단계의 오름차순으로 정렬한다.
function solution(N, stages) {
  const arr = [];
  let totalNum = stages.length; //스테이지에 도달한 모든 플레이어 수 
  for(let i=1; i<=N; i++){
    const stageNum = stages.filter(el => el===i).length; // i번째 단계에서 탈락한 인원수 
    let failRatio = 0;
    if(stageNum===0) failRatio=0;
    else{
      failRatio = stageNum/totalNum;
    }
    totalNum -= stageNum;
    arr.push({idx: i, ratio: failRatio});
  }
  
  arr.sort((a,b) => {
    if(a.ratio > b.ratio){
      return -1;
    }else if(a.ratio < b.ratio){
      return 1;
    }else{
      if(a.idx > b.idx){
        return 1;
      }else{
        return -1
      }
    }
  })
  return arr.map(el => el.idx);
} 

sort는 compareFunction을 인자로 받을 수 있다. compareFunction에 따라 오름차순 또는 내림차순으로 정렬된다. 배열은 compareFunction에 요소를 2개씩 반복해서 보내고, 두 요소의 차가 음수인지 양수인지, 0인지에 따라 정렬한다. 요소가 a,b인 경우 다음과 같이 정렬된다.

음수인 경우

  • a와 b의 위치를 바꾸지 않는다.

양수인 경우

  • a와 b의 위치를 바꾼다.

0인 경우

  • a와 b가 동일하므로, 문자열을 비교하는 경우 그 다음 인덱스 값으로 비교한다.
const arr = [1,4,6,2,5];
//오름차순 정렬 
arr.sort((a,b) => {
  if(a-b>0) {return 1;} //a가 b보다 크면 위치바꾸기 
  else if(a-b<0) {return -1;} //a가 b보다 작으면 위치 그대로
  else {return 0}
});
//[1, 2, 4, 5, 6]

//내림차순 정렬
arr.sort((a,b) => {
  if(a-b>0) {return -1;} //a가 b보다 크면 위치 그대로 
  else if(a-b<0) {return 1;} //b가 a보다 크면 위치 바꾸기
  else {return 0}
});
//[6, 5, 4, 2, 1]

오름차순에서는 a-b가 양수일때 위치를 바꾸고, 내림차순에서는 a-b가 음수일때 위치를 바꾼다.

reference

profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글