[programmers] 실패율 (2019 카카오 블라인드 채용)

resilient

·

2021. 9. 4. 21:44

728x90
반응형

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

  • 먼저 이문제는 최대 입력값을 확인한 뒤 DP 아니면 딕셔너리로 풀어야 시간 초과가 나지 않겠구나 라고 생각했다.
  • stages라는 리스트에 담긴 데이터들을 Counter라는 딕셔너리에 각 원소들 개수를 카운트에서 key와 value로 나타내고, 이때 0부터 주어진 N(stage개수)까지의 stage에 도달한 사람이 없을 경우 딕셔너리를 채우기 위해 value값을 0으로 설정해준다.
  • 어쨌든 실패율을 구하려면 해당 스테이지를 통과한 인원들을 구해야 하므로 Counter딕셔너리의 key값들을 for문을 돌리면서 N보다 작고, 해당 key값의 value가 0이 아니면 해당 stage에 있는 사람을 제외한 인원수를 더해서 실패율을 구하게 했다. 
  • 실패율을 fail_percentage라는 딕셔너리에 계산해서 value값으로 넣어주고 value값을 기준으로 내림차순 정렬해서 순서대로 key값을 return 시켜주면 된다.
def solution(n,stages):
    Counter = {}
    # n이 COunter에 없을 경우를 고려해주기 위해
    # 일단 n까지의 key 값에 value를 0으로 초기화해준다.
    for i in range(n):
        Counter[i+1] = 0
    # 여기서 stages리스트에 주어진 값으로 Counter 딕셔너리를 갱신해준다.
    for i in stages:
        if i <=n:
            if i not in Counter:
                Counter[i] = 0
            Counter[i] += 1
    # 실패율을 구해주기 위한 총 인원수
    user = len(stages)
    # 실패율을 담을 딕셔너리
    fail_percentage = {}
    for i in Counter.keys():
        # 스테이지는 n개이고 n+1(모든스테이지통과했을경우)를 고려해준다.
        if i <=n:
            # 이부분 중요!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            # Counter값이 0일경우 0을 나눌수가 없으므로 인덱스 에러가 발생할 수 있다.
            if Counter[i] == 0:
                fail_percentage[i] = 0
            else:
                fail_percentage[i] = Counter[i]/user
            # 나중에 for문으로 자기보다 낮은 스테이지를 통과한 인원수는
            # 제외시킨다.
            user -= Counter[i]
    # value값(실패율) 을 기준으로 내림차순 정렬해주고 
    fail_percentage = dict(sorted(fail_percentage.items(),key = lambda x: x[1],reverse=True))
    # 리스트형식으로 정렬된 데이터의 key값만 출력하면된다.
    answer = list(fail_percentage.keys())
    return answer
반응형