[JavaScript] 프로그래머스 실패율 / Sorting object property by values

Gaeun·2022년 11월 25일

프로그래머스 Lv.1

목록 보기
10/11

실패율

나의 풀이

function solution(N, stages) {
  // 배열 stages를 객체로 표현
  const obj = {};
	
  // 객체의 key는 1부터 N+1까지, value는 일단 0으로
  for (let i = 1; i <= N + 1; i++) {
    obj[i] = 0;
  }

  // 해당 stage당 멈춰있는 사람의 수 value로
  for (let i = 0; i < stages.length; i++) {
    // value가 0이면 1로 설정, 이미 1 이상이라면 +1
    if (obj[stages[i]] === 0) {
      obj[stages[i]] = 1;
    } else {
      obj[stages[i]] += 1;
    }
  }

  // 실패율 담을 객체 만들기
  const rate = {};
  
  // 실패율을 구할 때 분모의 값
  let total = stages.length;

  for (let i = 1; i <= N + 1; i++) {
    rate[i] = obj[i] / total;
    total = total - obj[i];
  }

  // 실패율 담은 객체를 내림차순하도록
  const sorted = Object.entries(rate).sort((a, b) => b[1] - a[1]);
  const result = [];

  for (let e of sorted) {
    result.push(Number(e[0]));
  }

  // N+1단계는 클리어한 사람이기 때문에 N단계까지만 반환하도록
  return result.filter((x) => x <= N);
}

접근 방법

  1. 우선 stages 배열을 객체로 만들었다. 모든 스테이지를 클리어한 경우 N+1이기 때문에 객체의 key를 1부터 N+1 까지 만들었다. value로는 일단 0을 담아두었다.
  2. 스테이지마다 멈춰있는 사람의 수를 value로 담았다.
  3. 실패율을 담을 객체를 만들어놓았다. 그리고 실패율은 해당 스테이지에 멈춰있는 사람의 수 / 스테이지에 도달한 플레이어의 수 이기 때문에 분모를 계산하기 위하여 일단 배열의 길이만큼 total이라는 변수에 할당하였다.
  4. total이라는 변수는 배열을 순회하면서 값이 변할 수 있게 하였다.
  5. 실패율을 담은 객체를 내림차순으로 반환할 수 있도록 하였다. 여기에서 N+1은 반환되지 않도록 filter 메소드를 사용하였다.

4번에서 조금 시간을 지체하였다. 처음부터 다른 방법으로 풀었다면 고민하지 않았을 것 같았는데 이미 여기까지 코드를 작성했으니 내림차순으로 어떻게든 반환하여야 했다. 이를 위해 구글링하였고, 괜찮은 방법들을 찾아 내 코드에 적용하였다. 이와 관련된 내용은 뒤에서 작성하도록 하겠다.

다른 사람의 풀이

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]);
}

...
또 현타만...
오는...
다른 사람의 풀이...
for 문에서 저렇게 filter 메서드를 사용할 방법을 생각하지 못했다. 와 진짜 저렇게 간단하게 할 수 있다니.... 객체를 이용하는 게 아니라 배열로 답을 찾아낼 수 있었다니... 그럼 객체의 value에 따라 내림차순으로 정렬할 방법을 찾지 않아도 되었잖아...! 왜 객체를 고집했을까 나는.... 하지만... 덕분에 하나 배울 수 있어서 ... 다행이다... ^^...

Sorting object property by values

이 문제의 첫 번째 입출력 예를 사용하여 설명하겠다.

key는 사용자가 현재 멈춰있는 스테이지의 번호, value는 스테이지의 실패율이다.

{
  1: 0.125,
  2: 0.42857142857142855,
  3: 0.5,
  4: 0.5,
  5: 0
}

실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return하기 위해서는 객체의 value로 정렬하여 그 key를 배열로 반환하여야 한다.

구글링을 통해 스택오버플로우블로그에서 방법을 찾았는데 내가 사용한 방법은 아래와 같다.

// rate = { 1: 0.125, 2: 0.42857142857142855, 3: 0.5, 4: 0.5, 5: 0 }

const sorted = Object.entries(rate).sort((a, b) => b[1] - a[1]);
const result = [];

for (let e of sorted) {
  result.push(Number(e[0]));
}

console.log(result)

Object.entries() 메서드를 사용하여 [key, value] 쌍의 배열을 만들고, 여기에 sort() 메서드를 사용하여 객체의 value 값을 내림차순으로 반환할 수 있도록 선언해두었다.

그 후, 객체의 value를 기준으로 내림차순으로 정렬된 [key, value]가 담긴 배열 중 key값만 새로운 배열에 담을 수 있도록 for문을 만들었다.

이렇게 글로 설명하고, 블로그를 작성하고 나니 굉장히 쉬운 것이었는데 문제를 푸는 순간에는 생각해내지 못했다는 게 많이 아쉽다. 내 것으로 만들 수 있도록 더 노력해야겠다.

profile
🌱 새싹 개발자의 고군분투 코딩 일기

0개의 댓글