본문 바로가기

항해99_10기/[2주차] 알고리즘 문제풀이

[32번][중상] 실패율

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

나의 풀이

 

 * 실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
 * N = 전체 스테이지의 개수
 * stages.length = 전체 사용자 수
 * stages[i] = 사용자가 멈춰 있는 스테이지
 * 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 리턴
 * ex) [2, 1, 2, 6, 2, 4, 3, 3] => [3, 4, 2, 1, 5] 
 *  stage 3 = 도달,클리어x 2 / 도달 4 ([3,3]/[3,3,4,6]) -> 실패율이 stage 4와 같지만 스테이지 순서가 작은 순으로 정렬
 *  stage 4 = 도달,클리어x 1 / 도달 2 ([4]/[4, 6])
 *  stage 2 = 도달,클리어x 3 / 도달 7 ([2,2,2]/[2,2,2,6,4,3,3])
 *  stage 1 = 도달,클리어x 1 / 도달 8 ([1]/[2, 1, 2, 6, 2, 4, 3, 3])
 *  stage 5 = 도달,클리어x 0 / 도달 1 ([]/[6])
 *  stage 6 = 도달,클리어x 1 / 도달 1([6]/[6])
 * 
 * 로직 => stages를 sort하고, 1 ~ N까지 루프를 돌면서, 각 스테이지에 머물러 있는 유저의 배열을 반환 -> 실패율 = 스테이지별 유저 배열.length / stages 배열 중 해당 스테이지의 첫번째 index부터 length-1까지 카운트 (length -index)
 * 예외 : N+1

 

[pseudo code]
1. sort((a,b)=> a-b)를 이용해 stages 배열을 오름차순으로 정렬
2. obj = [] 빈 오브젝트를 선언하고, 각 스테이지 별 실패율을 키-밸류로 넣어 줌
3. for loo 1~N까지 돌면서 각 스테이지의 실패율을 계산
    - fromIndex, start 변수를 선언
    - indexOf(searchElement, fromIndex)를 이용해 stages에서 i 값의 첫번째 인덱스를 찾아 start 변수에 할당
    - 다음 스테이지의 첫번째 index를 찾아 옴 (조건 : stages[stages.length-1] !== i)
        - i+1이 배열에 없는 경우, indexOf는 -1을 반환 => 반환값 >0 일때까지 계속 수행
        - 찾은 인덱스 값으로 fromIndex 변수에 할당
    - obj[i] = {stage: i, failure : (fromIndex - start) / stages.length-1 - start}
4. obj.sort((a,b) => b[failure] - a[failure] if(동률일 경우 처리))

 

function solution(N, stages) {
  stages = stages.sort((a, b) => a - b);
  let obj = [];

  for (let i = 1; i <= N; i++) {
    let lastIdx = 0,
      startIdx;
    if (stages.includes(i)) {
      startIdx = stages.indexOf(i, lastIdx);
      for (let j = stages.length - 1; j >= startIdx; j--) {
        //lastIdx = stages.findLastIndex((i) => i === i); findLastIndex 메서드가 안 먹음ㅠㅠ
        if (stages[j] === i) {
          lastIdx = j;
          break;
        }
      }
    } else startIdx = -1;

    startIdx < 0
      ? (failure = 0)
      : (failure =
          (lastIdx - startIdx + 1) / (Number(stages.length) - startIdx));
    obj[i - 1] = {
      stage: i,
      prob: failure,
    };
  }
  console.log(obj);

  return obj
    .sort((a, b) => (b.prob === a.prob ? a.prob - b.prob : b.prob - a.prob))
    .map((e) => e.stage);
}

console.log(solution(5, [2, 1, 2, 6, 2, 4, 3, 3]));

filter 사용해서 구현해보기!