[프로그래머스 / Python] 실패율

문제 출처

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

해당 스테이지에 사람이 없을때 예외처리를 안해주면 런타임 에러가 발생한다. 왜냐면 예를들어 10개의 스테이지가 있을때 모든 사람이 최대 5번 스테이지밖에 못갔다면 6~10 스테이지는 도전한 사람수가 0이기 때문이다.

 

또 주의 할 점은 이미 fail_rate에 스테이지 순으로 오름차순 정렬되도록 값을 넣었으므로 따로 정렬조건을 추가해 줄 필요 없다.

 

이 부분만 잘 신경쓰면 쉽게 풀 수 있다.

 

내 코드

def solution(N, stages):
    fail_rate = []
    
    length = len(stages)
    for i in range(1, N+1):
        user_number = stages.count(i)
        # user_number 가 0명일때는 실패율이 0임. 시도한사람이 없기때문
        # 이 if문 안걸면 런타임 에러발생 (왜냐면 초반 스테이지만 클리어한 유저만 있다면 후반부는 전부 user_number가 0이기 때문)
        if user_number == 0:
            fail_rate.append((0,i))
            continue
        fail_rate.append((user_number / length, i))
        length -= user_number # 이번 스테이지인원은 다음 스테이지 참여자 수에서 제외
        
        
    
    fail_rate.sort(key=lambda x: x[0], reverse=True) # 작은 번호순으로 이미정렬 되있으므로 실패율 기준 정렬만 함
    
    answer = [i[1] for i in fail_rate]
    
    return answer

 

정렬에 대한 예제를 다시 확인하여 다음 문제에 잘 적용하도록 하자

a = [(4,0), (4,3), (4,2), (3,2), (2,1), (1,0)]


# 인자 없이 sorted()를 사용하면 리스트 아이템의 각 요소 순서대로 정렬
# 첫 번째 요소가 같으면 두 번째 요소로 비교
b = sorted(a)
print(b)    # [(1, 0), (2, 1), (3, 2), (4, 0), (4, 2), (4, 3)]


# key인자에 lambda 함수를 넘겨주면 반환값을 가지고 비교해 정렬
# 이 때, key로 전달되지 않은 요소에 대해선 정렬하지 않음
c = sorted(a, key=lambda x : x[0])
print(c)    # [(1, 0), (2, 1), (3, 2), (4, 0), (4, 3), (4, 2)]
d = sorted(a, key=lambda x : x[1])
print(d)    # [(4, 0), (1, 0), (2, 1), (4, 2), (3, 2), (4, 3)]


# 정렬 기준으로 다중 조건을 넘겨줄 수도 있다
# 첫 번째 인자를 기준으로 오름차순 정렬을 먼저 한다.
# 그 결과를 가지고 두 번째 인자를 기준으로 내림차순 정렬(-를 붙이면 내림차순 정렬)
e = sorted(a, key = lambda x : (x[0], -x[1]))
print(e)    # [(1, 0), (2, 1), (3, 2), (4, 3), (4, 2), (4, 0)]

 

 

다른사람이 푼 방법

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)

 

이런식으로 익셔너리를 이용하여 정렬후 list로 반환하여 풀면 훨씬 간결하게 풀 수 있다.

 

 

댓글

Designed by JB FACTORY