PS (Problem Solving)/Programmers

[프로그래머스] 실패율

캐럿노트 2022. 8. 9. 23:34

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42889?language=python3 

 

프로그래머스

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

programmers.co.kr

 

설계

- 실패한 stage에 있는 사람 수 만큼 다음 stage에 진출하는 사람이 적어진다.

-  확률보다 순서대로 sort하는데 애먹었다. 값에 index를 부여하기 위해 2중 for문으로 만든 후 sort 작업을 진행했다. (lamda로 sort하는 방식은 자주 사용하지 않아 어색하다)

- 런타임 에러가 발생했다. 만약 5 스테이지까지 있다고 가정했을 경우 4스테이지에서 모두 탈락해버린다면 5스테이지에서 people이 0, 즉 zero divison이 발생하기 때문에 0 이상의 if 문을 적용했다.

 

Python

def solution(N, stages):
    bucket = [0] * (N+1)
    people = len(stages)
    for i in range(1, N+1):
        cnt = stages.count(i)   # 단계별 통과하지 못한 사람 count
        if people > 0:      # 만약 모두 탈락한 경우 zero divison 방지
            bucket[i] = cnt / people
            people -= cnt   # 실패한 사람만큼 다음 진출자는 줄어든다.

    bucket2 = [[i, bucket[i]] for i in range(N+1)]  # index를 구하기 위한 2중 for문
    bucket2.pop(0)       # 0 스테이지는 없음
    bucket2.sort(key=lambda x:x[1], reverse=True)

    answer = []
    for index in bucket2:
        answer.append(index[0])

    return answer

 

JavaScript

function solution(N, stages) {
  const bucket = [];

  // 실패율 계산
  for (i = 0; i < N; i++) {
    const num = 0;
    let cnt = 0;
    let cntTotal = 0;
    for (j = 0; j < stages.length; j++) {
      if (stages[j] >= i + 1) {
        cntTotal += 1;
      }
      if (stages[j] == i + 1) {
        cnt += 1;
      }
    }
    // 문모가 0이될 경우 방지
    if (cntTotal == 0) {
      cntTotal = 1;
    }
    bucket.push(cnt / cntTotal);
  }

  const answer = [];
  for (i = 0; i < N; i++) {
    const max = Math.max(...bucket);
    const index = bucket.indexOf(max);
    answer.push(index + 1);
    bucket[index] = -1;
  }
  return answer;
}