javascript/프로그래머스

[코딩테스트 연습]level 1. 실패율

sewonzzang123 2022. 6. 28.

목차

반응형

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

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스...

programmers.co.kr


 

문제:

슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

  • 실패율은 다음과 같이 정의한다.
    • 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

 


총 문제의 숫자 크기에 따라, for문을 돌면서

스테이지에 도달한 플레이어의 수 ( 도달한 스테이지가 해당 스테이지보다 크거나 같은 경우)와 실패한 플레이어의 수( 도달한 스테이지가 해당 스테이지와 같은 경우) 로 계산하여 index(몇번째 문제)와 value(실패율)를 담은 object 타입의 array를 만들었다.

그리고, sort를 사용해 value로 오름차순 정렬 후, index의 값을 배열로 return 해 주는 방법을 사용했다.

 

function solution(N, stages) {
    let answer = [];
    for(let i=0; i<N; i++){
        let newArr = stages.filter((value)=>{
            if(i+1<=value) return value;  // 스테이지에 도달한 플레이어 수
        })
        let newArr2 = stages.filter((value)=>{
            if(i+1===value) return value; // 실패한 플레이어 수
        })
        
        answer[i] = {index: i+1, 
                     value: newArr2.length ===0 ? 0 : 
                    newArr2.length/newArr.length };
    }    

    answer.sort((prevValue, value)=>{
        return value.value - prevValue.value;
    })
    
    return answer.map((value)=>{
        return value.index;
    });
}

 

 


나는 object 타입의 객체를 사용해야 한다고만 생각을 했었는데, 2차원 배열을 사용한 케이스가 있어서 가져왔다.

코드 구성은 비슷한 것 같았는데 내 코드보다 빠르게 동작하는 것을 보고 차이점을 보고 분석해보았는데,

1. filter를 한 후 바로 length를 구해서.

2. push를 통해 array에 값을 넣었기 때문.

인듯 하다.

 

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

 

 

실제로 속도를 비교하는 글을 찾아본 결과 array[i]에 직접 넣는 경우보다 array.push()를 통해 배열에 값을 넣는 것의 성능이 더 높다는 것을 알게 되었다.

 

https://12bme.tistory.com/134

 

[자바스크립트] 성능을 높이는 코드 스타일

자바스크립트의 기본 요소인 반복문과 조건문, 문자열 연산과 함께 배열과 객체의 생성과 초기화, 문자열 연산, 정규 표현식, 변수 탐색 등을 어떻게 작성하느냐에 따라 자바스크립트의 실행 성...

12bme.tistory.com

반응형

댓글