[프로그래머스] 실패율

해달·2022년 1월 3일
0


문제 풀이

입출력
게임을 이용하는 사용자가 멈춰있는 스테이지 번호가 담긴 stages
전체스테이지의 개수 N를 입력값으로 받는다


구해야 하는 값

  1. stage를 클리어한 유저
  2. stage에 머물러있는 유저
  3. 실패율
  4. 실패율의 stage

실패율 = 클리어하지 못한 플레이어 수 / 스테이트 도달한 플레이어 수을 구하여
실패율이 높은 스테이지 부터 <내림차순>으로 스테이지 번호가 담겨있는 배열을 return 해야한다


코드

function solution(N, stages) {
  let result = [];
    
  for(let i = 1 ; i<=N; i++){
    let pass = passUser(i,stages)
    let challenge = challengeUser(i,stages)
    result.push([i,challenge/pass]) // index와 함께 실패율을 result배열에 저장한다
  }
  
  result.sort((a,b) => { //sort를 사용하여 내림차순 정렬을 해준다
    if(a[1] < b[1]) return 1
    if(a[1] > b[1]) return -1
      
    if(a[1] === b[1]){
        if(a[0] < b[0]) return -1
        if(a[0] > b[0]) return 1
    }
  })
    

  return result.map(el => el[0])
}

function passUser(num, stages){ // 스테이지를 통과 한 유저의 수
  return stages.filter(el => el >= num).length
}

function challengeUser (num, stages){ // 스테이지에 도전중인 유저의 수
  return stages.filter(el => el === num).length
}

sort는 결과 값에 따라 정렬이 이루어지는데 -1 오름차순 , 1 내림차순 으로 정렬된다
내부에서 if로 분기를 나누어주어서 각 index 값으로도 비교하여 정렬 해줄 수 있다


코드 수정

다른분의 풀이중에서 같은 로직인데 조금 더 간결하게 작성하신분이 계셔서 참고하여 코드를 수정하였다

불필요한 함수를 생성했던 코드를 지우고 바로 filter로 값을 구해 주었다

sort 하면서 내부에서 if로 분기를 나누어 주었는데 굳이 나누어주지 않고
첫번째값으로 내림차순정렬을 해주었다

입출력예시에 아래와 같이 실패율이 동일 할 경우에는 stage값이 오름차순 정렬이 되어있다

만약 아래와 같이 실패율의 값이 같다면
stage값은 오름차순으로 정렬되기 때문에 실패율만 비교해 주면 되었다

수정한 코드

function solution(N, stages) {
  let result = [];
    
  for(let i = 1 ; i<=N; i++){
    let passUser = stages.filter(el => el >= i).length // 스테이지를 통과 한 유저의 수
    let challengeUser = stages.filter(el => el === i).length // 스테이지에 도전중인 유저의 수
    result.push([i,challengeUser/passUser]) // index와 함께 실패율을 result배열에 저장한다
  }

  result.sort((a,b) => b[1] - a[1]); 
  return result.map(el => el[0])
}

0개의 댓글

관련 채용 정보