반응형
programmers.co.kr/learn/courses/30/lessons/42889
Solution 1 - Counter 모듈 사용 / 일일이 더해야 하는 번거로움 존재
import collections
def solution(N, stages):
lst = []
counter = collections.Counter(stages)
def stage(i):
challenge = 0
fail = 0
for key in range(i, N+2):
if key >= i:
challenge += counter[key]
if key == i:
fail += counter[key]
if not challenge:
return 0
return fail / challenge
for i in range(1, N+1):
lst.append([i,stage(i)])
lst.sort(key = lambda x : (-x[1], x[1]))
return [x[0] for x in lst]
Counter를 사용하여 풀었지만 비효율적인 요소가 존재한다.
challenge를 더하면서 구할때 리스트라면 슬라이싱으로 훨씬 간단하게 구현할 수 있기 때문이다.
그래서 리스트를 사용해서 다시 풀어봤다.
그리고 마지막에 정답 리스트를 구현할 때 위에서는 정렬을 한 후 다시 리스트 컴프리헨션으로 새 리스트를 만들어냈다. 하지만 딕셔너리를 사용한다면 value에 따른 정렬을 한 후 key를 출력하면 되기 때문에 훨씬 간편해진다.
딕셔너리도 정렬이 된다는 점 잊지말자!!!
Solution 2 - 리스트 사용 / 슬라이싱으로 연속된 값 빠르게 합산
def solution(N, stages):
lst = [0]*(N+2)
for stage in stages:
lst[stage] +=1
dct = {}
for i in range(1, N+1):
challenge = sum(lst[i:])
dct[i] = lst[i] / challenge if challenge else 0
result = sorted(dct, key=lambda x: dct[x], reverse=True)
return result
댓글