프로그래머스 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 식을 활용하여 정렬하는 표현방식을 확인할 수 있었습니다.