js 프로그래머스 실패율

이명진·2022년 7월 28일
0

코드카타

목록 보기
32/68

프로그래머스 js 실패율

레벨 1단계의 문제이다.
카카오 블라인드 테스트 2019년도 문제 이다. 시간제한이 있었으면 나름 어려웠을듯 싶다.

문제 해설

게임내에서 각 단계별로 남아있는 사람으로 계산하여 실패율을 계산하는 문제이다.
실패율은 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 로 구할수 있다.

매개변수로 단계의 개수와, 스테이지에 도전하는 사람들의 단계가 주어지는데
실패율을 다시 계산하면 매개변수(stages)/스테이지에 도달한 플레이어 수로 계산이 가능하다.

문제 풀이

첫번째 도전

처음에는 스테이지에 도전한 사람들을 정렬하고 스택과 큐를 이용해서 문제를 해결하려고 생각했었다.
스택안에 같은 단계사람들을 넣어놓고 숫자를 계산해서 실패율을 구한다.
하지만 이런저런 구멍이 많았다.

처음 코드이다.

function solution(N, stages) {
    let answer = [];
  	stages.sort((a,b)=>a-b)
  	let cnt = stages.length;
  	let boonmo = stages.length;
  	let stack = [];
  let index = 0;
  	for(let i=0;i<cnt;i++){
      let que = stages.shift();
   		if(!stack.length || stack[0]==que){
        stack.push(que);
        
      }else{
      console.log(stack,stack.length,boonmo)
        index++
        answer.push([stack.length/boonmo,index])
        boonmo-=stack.length
        stack=[];
        stack.push(que);
      }
      
    }
  	answer.sort((a,b)=>{return b[0]-a[0]})
  	answer= answer.map(x=>{
      return x[1]
    })
  	if(answer.length<N){
      answer.push(index+1)
    }
    return answer;
}

index를 따로구해서 실패율과 index를 넣어두고 실패율을 다시 정렬해서 index만 다시 도출하는 방법을 생각했다.
하지만 두번째 테스트 케이스에서 실패하였고 코드도 복잡해서 다시 지우고 풀어보게 되었다.

맨 처음 같은 숫자들끼리 모이도록 정렬을 하는데 굳이 스택과 큐를 사용해야 될까 라는 생각이 들었고
그냥 index로 끊어볼까 생각하다가 filter 함수가 생각이나서 filter를 사용하여 로직을 새로 작성하였다.

두번째 도전 코드

function solution(N, stages) {
    let answer = [];
  	stages.sort((a,b)=>a-b)
  let boonmo = stages.length;
  for(let i=1; i<N+1;i++){
    let idx = stages.filter(x=>x===i)
    
    // console.log(idx,i,N)
    answer.push([idx.length/boonmo,i])
    boonmo-=idx.length
    
  }
  answer.sort((a,b)=>b[0]-a[0])
  // console.log(stages)
  answer = answer.map(x=>{return x[1]})
    return answer;
}

첫번째 도전보다 상당히 줄었다.

처음 정렬을 하게 되면 [1,2,2,2,3,3,3,4,4 ]
이렇게 분류가 되어 있으므로 굳이 스택과 큐로 새로 정렬할 필요가 없었다.
filter로 간단하게 새롭게 배열을 뽑아내서 쉽게 구할수 있었다.

마지막 sort와 map부분에서 더 줄일수 있을까 생각을 하게 되었다.

다른 방법으로 풀수도 있을것 같은데 리팩토링 방법을 더 생각해봐야 겠다.

이전에는 못풀었던 레벨1단계 문제인데 어느덧 풀고 있는 나를 보니 신기하기도 하다.

다른사람의 풀이를 보니 내 코드와 비슷하다. 정답인듯 싶다.

오늘도 문제 해결

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글