Algorithm/Programmers

[Python] 실패율

느낌표 공장장 2021. 5. 2. 00:33
def solution(N, stages):
    fail = {}
    success = len(stages)
    
    for i in range(1, N+1) :
        if i not in stages :
            fail[i] = 0
            continue
            
        else :
            stop = stages.count(i)
            fail[i] = stop/success
            success -= stop
            
    return sorted(fail, key=lambda x : fail[x], reverse=True)

풀이

1) stages에 없는 단계(실패율 0) 저장

    fail = {}
    success = len(stages)
    
    for i in range(1, N+1) :
        if i not in stages :
            fail[i] = 0
            continue

① i 단계가 실패율이 '얼마' 이다를 저장해주기 위해 딕셔너리를 만들어준다.

② 실패율이 " 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 "  이므로 

    '스테이지에 도달한 플레이어 수'를 쉽게 계산하기 위해 stages의 길이를 success 변수에 저장해준다.

 

③ stages에는 1부터 N+1까지의 자연수가 담겨있기 때문에 for문의 범위도 range(1, N+1)로 설정해주었다.

④ 만약 i가 stages 리스트에 없다는 것은 i 스테이지에 멈춰있는 유저가 없거나, 스테이지에 도달한 유저가 없다는 의미이므로 fail에 { i : 0} 을 저장하고 반복문으로 다시 돌아간다.

 

2) 실패율 계산

   else :
      stop = stages.count(i)
      fail[i] = stop/success
      success -= stop

else문으로 온다는 것은 stages리스트에 있다는 의미이므로

① stop 변수에 i를 count하여 넣어준다.

② 실패율( stop/success )을 계산하여 fail에 저장한다.

③ 다음 실패율 계산을 위해 success(스테이지에 도달한 플레이어 수)에서 클리어하지 못한 플레이어 수를 빼준다.

 

3) 정렬

    return sorted(fail, key=lambda x : fail[x], reverse=True)

sorted에 fail(실패율 딕셔너리)를 넘기면 fail의 key값들이 들어가게 된다. 여기에 lambda식을 이용하여 value를 기준으로 정렬해준다. 

즉, value값으로 정렬하지만 반환되는건 key값들인 것이다 !

여기에 실패율이 높은 것 부터 정렬해야하므로 reverse=True 넣어준다.

 

'Algorithm > Programmers' 카테고리의 다른 글

[Python] 소수 만들기  (0) 2021.05.11
[Python] 오픈채팅방  (0) 2021.05.07
[Python] 다트 게임  (0) 2021.05.01
[Python] 비밀지도  (0) 2021.04.30
[Python] 키패드 누르기  (0) 2021.04.29