KEEP GOING

[python] 프로그래머스 42889번 : 실패율 (정렬, ZeroDivisionError) 본문

code review/sort

[python] 프로그래머스 42889번 : 실패율 (정렬, ZeroDivisionError)

jmHan 2022. 1. 11. 22:06
반응형

 

 

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

1. 테스트케이스에서 실패한 코드 (정확성 33.3)

def solution(N, stages):
    answer = []
    stages.sort()
    for i in range(1,N+1):
        count = 0
        numOfPlayers = 0
        while stages:
            numOfPlayers = max(numOfPlayers, len(stages))
            if i == stages[0]:
                # numOfPlayers = max(numOfPlayers, len(stages))
                stages.pop(0)
                count += 1
            else:
                # numOfPlayers = max(numOfPlayers, len(stages))
                break
        # print('num',numOfPlayers)   
        if numOfPlayers == 0:
            continue
        answer.append((round(count/numOfPlayers,4), i))
    answer.sort(key = lambda x:(-x[0],x[1]))
    # print(answer)
    result = [] 
    for data in answer:
        result.append(data[1])
    return result

 

 

2. 코드 개선 ( 정확성 44.4)

def solution(N, stages):
    stages.sort()
    # print(stages)
    failLst = []
    # 1부터 n까지의 스테이지에 대한 실패율 구하기
    for i in range(1, N+1):
        count = 0
        for stage in stages:
            if stage == i:
                count += 1
        failure = round(count/len(stages), 5) if len(stages) != 0 else 0 
        # print(failure)
        failLst.append((failure, i))
        stages = stages[count:]
    # print(result)
    failLst.sort(key=lambda x:-x[0])
    result = []
    for data in failLst:
        result.append(data[1])

    return result

11번 코드에  if len(stages) != 0 else 0 을 추가하여 

분모가 0이되어 zeroDivisionError가 발생하는 경우를 제거하였고 정확성이 15점 정도 올라갔다. 

 

 

3. 성공한 코드 

def solution(N, stages):
    stages.sort()
    # print(stages)
    failLst = []
    # 1부터 n까지의 스테이지에 대한 실패율 구하기
    for i in range(1, N+1):
        # i의 개수 카운트 
        count = stages.count(i)
        # 분모가 0일 때(ZeroDivisionError) 처리
        failure = count/len(stages) if len(stages) != 0 else 0 
        failLst.append((failure, i))
        stages = stages[count:]
    
    failLst.sort(key=lambda x:-x[0])
    failLst = [x[1] for x in failLst]
    return failLst

stages 리스트에서 1~N 까지의 개수를 구할때 리스트의 내장함수인 count 변수를 이용하여 코드를 개선하였다.

또한 result 리스트를 새로 생성하지 않고 다시 failLst에 담는 방식으로 메모리를 줄여주었다. 

 

반응형
Comments