프로그래머스_실패율

임정민·2023년 12월 6일
0

알고리즘 문제풀이

목록 보기
130/173
post-thumbnail

프로그래머스 Lv1 문제입니다. 실전에 대비하기 위해 30분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 25분


from collections import deque

def solution(N, stages):
    answer = {}
    res = []
    
    now = deque([i for i in range(1,N+1)])
    stages = sorted(stages)
    idx = 0

    while now:
        
        v = now.popleft()
        reaches = len(stages[idx:])
        
        if reaches==0:
            answer[v] = 0
            continue
        clears = 0
        
        for stage in stages[idx:]:
            if v==stage:
                clears += 1
                idx += 1
            else:
                break
        answer[v] = clears/reaches
        
    for ans in sorted(answer.items(), key = lambda x : x[1],reverse=True):
        res.append(ans[0])
    
    return res

입력된 게임 스테이지별 달성 비율을 출력하는 문제입니다.

유저별 현재 스테이지를 정렬하고 1단계부터 마지막 스테이지까지 돌며 문제에서 정의한 실패율(스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수)을 구하였습니다.

스테이지별 실패율 dict 객체를 sorted() lambda 식을 활용하여 실패율이 높은 순서대로 정렬하여 답을 도출하였습니다.

[다른 사람의 풀이1]


def solution(N, stages):
    answer = []
    fail = []
    info = [0] * (N + 2)

    print("info : ",info)
    for stage in stages:
        info[stage] += 1
    for i in range(N):
        be = sum(info[(i + 1):])
        yet = info[i + 1]
        if be == 0:
            fail.append((str(i + 1), 0))
        else:
            fail.append((str(i + 1), yet / be))
    for item in sorted(fail, key=lambda x: x[1], reverse=True):
        answer.append(int(item[0]))
    return answer

유사한 풀이 방식이되 유저별 현재 스테이지를 정렬하지 않고 key,value 값으로 저장하였다는 점이 달랐습니다. 이 때문에

'나의 풀이' 대비 연산 시간이 훨씬 빨랐습니다.

[다른 사람의 풀이2]


def solution(N, stages): # 실패율 O(n)
    answer = []

    # 도달 스테이지별 유저수
    sum_list=[0]*(N+2)

    # 스테이지별 실패율
    dic_list={}
    stages.sort()
    now=len(stages)
    for i in stages:
        sum_list[i]+=1
    
    for i in range(1, N+1):
        if now==0:
            dic_list[i] = 0
            continue
        dic_list[i] = sum_list[i]/now
        now-=sum_list[i]
        
    return sorted(dic_list, key=lambda x : dic_list[x], reverse=True)

전반적으로 '다른 사람의 풀이1'과 비슷한 풀이 방식입니다. 또한 '나의 풀이'처럼 dict 객체를 sorted(),lambda 식을 활용하여 정렬하는 표현방식을 확인할 수 있었습니다.

profile
https://github.com/min731

0개의 댓글