프로그래머스

[1단계] 실패율

chsua 2022. 11. 16. 16:16

문제 설명

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

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

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

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

 

제한사항

  • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
  • stages의 길이는 1 이상 200,000 이하이다.
  • stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
    • 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
    • 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
  • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
  • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
내 답안:
function solution(N, stages) {
    let staUser = [0] ; //현재 유저 수 /index -> 단계 / [n+1] = 완주
    let score =  [0] ;  //지나간 유저 수 + 현재 유저 수 /index -> 단계
    let allSet = new Map() ; // key-단계, value-실패율
    for (let i = 0 ; i <= N ; i++) { // 기본 setting
        staUser.push(0) ;
        score.push(0) ;
    }
    for (let j = 0 ; j < stages.length ; j++) { // 각 arr에 넣기
        staUser[stages[j]] +=1 ; 
        for (let k = 1 ; k <= stages[j] ; k++) {
            score[k] += 1 
        }
    }
    for (let k = 0 ; k < staUser.length ; k++ ) {  // allSet 안에 실패율(value) 넣기
        allSet.set(k, staUser[k]/score[k]);
    }
    allSet.delete(0) ; // 0단계 없애기
    allSet.delete(staUser.length - 1) ; //완주 없애기
    allSet = [...allSet].sort((a,b) => b[1] - a[1]); //value 내림차순으로 정렬
    let answer = [] ; 
    for (let m = 0 ; m <allSet.length ; m++) {  //key값 추출
        answer.push(allSet[m][0]) ;
    }
    console.log(allSet)
    return answer;
}
조언: 
* arr => value를 기반으로 정렬 해서 index를 추출
* (keyword: argsort) => js argsort

let new_arr = Array.map((v) => {return v+1;});
let new_arr = Array.map((v) => (v+1));  //1과 동일한 결과
let new_arr = Array.map((v, i) => [i, v]); // i=index로 자동부여

(ref: Array.prototype.map() - JavaScript | MDN (mozilla.org) )
(ex: python -> enumerate(list) : [(0, v1), (1, v2), …] )같은 작동을 하는 함수

arr.map(v,idx,arr) ;
idx/arr는 선택요소

map은 한정적인 용도로 쓸때만 사용하는 것이 좋음
(용도: 원소 하나하나 단순변환)

ex)
let coordinate = [[1,3],[5,2],[4,6]] // [x,y]
coordinate.map((v) => [v[0]+1, v[1]]) // x쪽으로 전부 한칸 이동
[[2,3],[6,2].[5,6]]

ex) 아래 두 가지는 동일한 결과, 정수형을 문자형으로 변환
* let strArray = intArray.map((v) => v.toString())

* let strArray = [];
for i = 0; i < intArray.length; i++ {
strArray.push(intArray[i].toString());
}

* 2차원 배열으로 풀기
arr.map((val, i) => [val, i])
.sort((a, b) => a[0]-b[0])
.map((val) => val[1])

'프로그래머스' 카테고리의 다른 글

[1단계] 정수 내림차순으로 배치하기  (0) 2022.11.16
[1단계] 핸드폰 번호 가리기  (0) 2022.11.16
[1단계] 폰켓몬  (0) 2022.11.16
[1단계] 수박수박수박수?  (0) 2022.11.16
[1단계] 소수 만들기  (0) 2022.11.16