[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 실패율 (프로그래머스 lv1, 파이썬)

inu 2021. 6. 8. 17:30
반응형

문제

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr


풀이

def solution(N, stages):
    result = {}
    denominator = len(stages)
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
        else:
            result[stage] = 0
    return sorted(result, key=lambda x: result[x], reverse=True)
  • stages에는 플레이어들이 어떤 스테이지에서 멈췄는지에 대한 정보가 들어있다. 따라서 count를 통해 쉽게 해당 스테이지에 도달했으나 멈춘 사람의 수를 파악할 수 있다
  • 그리고 해당 스테이지에 도달한 사람은 1라운드에서는 '전부', 2라운드에서는 '전부-1라운드에서멈춘사람', ... 으로 진행할 수 있다
  • dict의 items()를 적용하지 않고 바로 전달하면 result의 key들이 lambda로 전달된다.
  • 이 때 정렬기준은 result의 key에 해당하는 결과값, 즉 실패율이 된다. 정렬된 return은 key값이므로 바로 처리가 가능하다.
def solution(N, stages):
    fail = {}
    for i in range(1, N+1):
        try:
            fail_ = len([a for a in stages if a == i]) / \
                len([a for a in stages if a >= i])
        except:
            fail_ = 0
        fail[i] = fail_
    answer = sorted(fail, key=fail.get, reverse=True)
    return answer
  • 조건문을 활용한 배열생성을 활용할 수도 있다. (문법기억)
  • try except를 활용해 분모가 0일 경우를 체크하고 0으로 만들었다.
  • 마지막에 정렬에선 아예 fail.get을 key함수로 주어서 그를 기준으로 삼는다(위의 풀이에서 key값을 받아 직접 접근했던 것과 로직상으로는 동일). key값이 들어가면서 fail dictionary로부터 값을 얻고 그를 기준으로 삼는 것이다.
반응형