본문 바로가기
코테연습

58. 실패율 Javascript

by hxunz 2022. 6. 8.

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 실패율이 높은 스테이지부터 스테이지 번호를 내림차순으로 나타내라
  • 주어진 자료는 무엇인가?
     - 실패율 구하는 방법 : 스테이지에 도달했으니 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
     - N : 전체 스테이지의 개수

     - stages : 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열
  • 조건은 무엇인가?
     - stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
     - N + 1은 마지막 스테이지(N번째 스테이지)까지 클리어 한 사용자를 나타낸다.
     - 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 한다.
     - 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0으로 정의한다.
  • 숨겨진 조건이나 자료가 있는가? 그렇다면 그것을 다른 방법으로 해석해보라.
     - return되는 배열의 길이는 N의 길이와 같다.

 

2. 계획

  1. 스테이지에 도달한 플레이어 수를 구한다.
  2. 각 스테이지의 실패율을 구한다
  3. 각 스테이지의 실패율을 내림차순으로 정렬한다
    실패율이 같다면 오름차순으로 정렬한다.
  4. 인덱스로 반환한다.

 

3. 실행

const solution = (N, stages) => {
  const personInStages = [];
  for (i = 0; i < N + 1; i++) {
    personInStages.push(stages.filter(stage => stage === i + 1).length);
  };

  let remainPersons = stages.length;
  const fail = usersInStages.map((it, index) => {
    const result = it / remainPersons;
    remainPersons -= it;
    return {
      index: index + 1,
      percent: result
    };
  }).slice(0, N);
  
  const test = fail.sort((a, b) => b.percent - a.percent);
  const realResult = test.map(it => it.index);
  return realResult;
};

test('실패율', () => {
  expect(solution(5, [2, 1, 2, 6, 2, 4, 3, 3])).toEqual([3, 4, 2, 1, 5]);
});

test('모든 사용자가 마지막 스테이지에 있을 경우', () => {
  expect(solution(4, [4, 4, 4, 4, 4])).toEqual([4, 1, 2, 3]);
});

 

 

 

처음 풀 때 실패율 구하는 로직을 어떻게 해야할지 생각이 안나서 고민하다가 몇일을 방치해뒀었던 문제..
드디어 풀었다.
실패율 구하는 부분은 map을 사용했고 이를 객체로 리턴해주었다. 
객체로 리턴하니 index와 실패율 부분이 명확하게 보여서 인덱스를 리턴해주는 부분 문제 풀이를 이어나갈때 도움이 되었다. 

고민하다가 못 풀었던 문제여서 그런지 풀고나니가 속 시원하고 그렇게 어렵게 생각할 문제가 아니었다는 것도 깨닫게 되었다. 
빨리 정답을 리턴하고 싶어서 그 문제 풀이 과정을 자세히 생각안하려는 자세를 고쳐야겠다,, 

계획 부분을 원래는 구구절절 풀이 설명하듯이 썼었는데 이번에는 간결하게 적어봤는데 깔끔해서 좋다.

'코테연습' 카테고리의 다른 글

60.약수의 개수와 덧셈 Javascript  (0) 2022.06.11
59. 예산 Javascript  (0) 2022.06.08
57. 부족한 금액 계산하기 Javascript  (0) 2022.06.08
56. 폰켓몬 Javascript  (0) 2022.05.31
55. 체육복 Javascript  (0) 2022.05.31

댓글