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

반응형

댓글