출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기


카카오 블라인드 리크루트먼트 문제이다:

def solution(N, stages):
    stage_result = []
    for i in range(1, N+1):
        stage_finished = len([j for j in stages if j > i]) 
        on_stage = stages.count(i)
        if on_stage == 0:
            failed = 0
        else:
            failed = on_stage/(on_stage+stage_finished)
            if stage_finished == 0:
                failed = 1
        stage_result.append([i, failed])
    return [k[0] for k in sorted(stage_result, key=lambda x: x[1], reverse=True)]


카카오 문제 답게 상당히 긴 시간이 필요했다. 푼 방식은 다음과 같다:

  1. stage_result라는 빈 배열을 정의한다.
  2. 1 부터 N까지의 숫자들 중에서, stages 배열에 있는 i보다 더 큰 수들을 세어주고, 이를 stage_finished라고 정의한다.
  3. on_stagestage에 존재하는 i의 개수를 저장해준다.
  4. 만약 on_stage 값이 0이라면, 실패율 failed 는 0으로 정의해준다. 이를 해주는 이유는 실패율을구하는 문제에서, 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수가 0이면서도 스테이지에 도달한 플레이어 수도 0이어서, ZeroDivisionError이 뜰 수도 있기 때문이다.
  5. 만약 on_stage 값이 0이 아니라면, 정상적으로 실패율 계산을 돌려주고, 이때 만약 stage_finished 값이 0이라면 실패율은 1로 정의한다.
  6. 마지막으로 stage_result 배열에 해당 숫자와 실패율을 담은 배열을 append해주고, 문제의 형식에 알맞게 출력하기 위해 sorted()lambda 함수를 사용해준다.

역시 카카오 블라인드 문제 답게 어려웠다. 까딱하면 런타임에러가 뜨고, 이를 찾기 위해 많은 시간을 보냈어야 했다.