스터디 기록9

유아현·2022년 11월 25일
0

Study

목록 보기
10/27
post-thumbnail

오늘의 스터디 문제 목록

실패율

function failureRate(unpassed, arrive){ // 실패율 구하는 함수
    return unpassed / arrive;
}

function solution(N, stages) {
    // 실패율: 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    // 스테이지에 도달했으나 아직 클리어하지 못한 플레이어 === stage <= 스테이지에 도달한 플레이어
    
    // n을 돌면서 스테이지 filter로 stages 하나씩 돌아줌
    // 돌면서 n(i)이랑 같으면  uppassed , 같거나 arrive임  그걸 변수에 넣어서

    
    // 전체 스테이지(N)를 돌면서 filter로 stages의 요소도 하나씩 도는데 스테이지와 유저가 머문 스테이지가 같다면 unpassed, 유저가 머문 스테이지가 더 크거나 같으면 arrive
    // filter로 걸러 준 다음에 length로 플레이어 수를 구함
    // 실패율 구함
    // 2차원 배열로 0번째는 스테이지 번호, 1번째는 실패율
    
    let arr = [];
    let unpassed = 0;
    let arrive = 0;
    
    for(let i = 1 ; i <= N ; i++){
        let result = 0;
        const unpassed = stages.filter(ele => { // 스테이지에 도달했으나 클리어하지 못한 플레이어 수
            return ele === i;
        }).length;
        const arrive = stages.filter(ele => { // 스테이지에 도달한 플레이어 수
            return ele >= i;
        }).length;
        result = failureRate(unpassed, arrive); // 실패율
        arr.push([i, result])  // arr에 2차원 배열로 넣어줌
    }
    
    // 내림차순 정렬(b - a), 실패율은 1번 째 인덱스에 있으니까 정렬 기준으로 잡아 준다
    arr.sort((a, b) => {
        return b[1] - a[1]
    });
    
    // [i][0]만 뽑아오면 되므로 map 써서 배열 리턴
    return arr.map(ele => ele[0]);
    
    
}

대부분 접근하는 방식은 비슷했으나 filter를 쓰지 않고 푼 방법 중에 효근님 코드가 좋았다!!
그리고 객체로 했을 때 sort 하는 방법까지도 ^ㅁ^

<효근님 코드>


// 순회하면서 해당 인덱스에 값이 있으면 +1
const sortStages = (N,stages) => {
    const newArr = new Array(N+1).fill(0);
    for(value of stages){
        newArr[value-1] = newArr[value-1] + 1 ;
    }
    return newArr;
}
// 순회하면서 분자의 값은 인덱스에서 꺼내고
// 분모의 값은 이전 분자의 값들을 빼나감.
const getFailureRates = (sortedStages, people)=>{
    let denominator =  people;
    let index = 1;
    const newArr = [];
    for(const num of sortedStages){
        // 정렬해도 인덱스를 기억하기 위해 객체로 담았다.
        const newObj = {
            'index' : index,
            'value' : num / denominator
        };
        newArr.push(newObj);
        denominator = denominator - num;
        index++;
    }
    // 마지막은 마지막 스테이지 클리어 여부니깐 스테이지가 아님
    return newArr.slice(0, newArr.length-1);
}
function solution(N, stages) {
    // 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    // 전체 스테이지의 개수 N
    // 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stage
    // 스테이지에 도달한 플레이어 수 === 전체 플레이어 수 - 이전 스테이지 클리하지 못한     // 수
    // 멈춰있는 스테이지별 배열을 만든다.
    // 실패율을 모아놓은 배열을 만든다.
    
    
    const answer = [];
    const sortedStages = sortStages(N,stages);
    console.log(sortedStages);
    const failureRates = getFailureRates(sortedStages, stages.length)
    console.log(failureRates);
    failureRates.sort((a , b)=>{
        if(a.value > b.value){
            return -1;
        } 
        if(a.value < b.value){
            return 1;
        }
        return 0;
    });
    
    // 정렬된 객체 배열의 index 값을 순서대로 담아준다.
    for(obj of failureRates){
        answer.push(obj['index']);
    }
    
    return answer;
}

<승연님 (객체로 sort)>

function solution(N, stages) {


    let opened = 0;
    let unclear = 0;
    let stageFailrate = [];

    //스테이지(N)별 클리어 못한 플레이어 수 찾기 
    for(let i = 1; i <= N; i++){
        unclear = stages.filter((player) => i === player).length; //클리어 못한자 = 현재 스테이지 i 레벨이랑 같은자
        opened = stages.filter((player) => i <= player).length; //해당 스테이지가 열린자 == i스테이지보다 같거나 큰자
        let failrate = unclear / opened;
        stageFailrate.push({stage: i, rate : failrate });  //객체형태로 {스테이지레벨:실패율}을 결과배열안에 푸시
      }                                                     // {stage 2 : rate : 0.42...}

        //실패율이 높은것 내림차순 정렬하기  
            //일단 객체로 푸시를하긴했는데, 어떻게 정렬할지몰라서 검색해봤는데..겉에게 배열이니까 sort를 할 수있엇슴.
            //오 지저스 배열안 내용물이 객체여도 sort가 먹잖아?
            //mdn | 개체는 해당 속성 중 하나의 값을 기준으로 정렬 할 수 있습니다 의 예시를 따라함.

      stageFailrate.sort((a,b)=> {
          if(a.rate === b.rate) return a.stage - b.stage; //실패율이 같으면 낮은레벨 스테이지가 먼저오게 해준다.
          else return b.rate - a.rate;       //그게아니라면 높은 실패율부터 내림차순되게 해준다.
      });
                                                        //이제 실패율이 높은것 부터 객체로 담겨있는 배열을
      return stageFailrate.map((obj) => obj.stage);     //객체의 stage값 으로만 남겨두기로 맵핑 
  }                                                         //[3,4,2,1,5]

0개의 댓글