문제
https://programmers.co.kr/learn/courses/30/lessons/42579
풀이
‘이건 알고리즘보다 자료구조에 치중된 문제가 아닌가?’
생각하면서 다 풀고 보니까 3레벨 문제였네.
‘설마 이중해시일까?, 아니겠지’ 하면서 계속 고민 해봤지만
결국 이중해시로 해결한 문제였다.
알고리즘 자체는 어려울게 없었으나
파이썬 이중해싱 방법을 처음 겪어봐서 헤맸다.
제출한 코드
def solution(genres, plays):
answer = []
h = {}
for i in range(len(plays)) : # 이중해싱
if genres[i] in h :
h[genres[i]].update({i:plays[i]})
else :
h[genres[i]] = {i : plays[i]}
# 장르, 플레이합계 기준, 내림차순 정렬
lst = sorted(h.items(), key=lambda x: sum(x[1].values()), reverse=True)
for l in lst :
s = sorted(l[1].items(), key=lambda x: x[1], reverse=True) # 플레이 기준 내림차순 정렬
if len(s) < 2 : # 한 곡이면 한 곡만
answer.append(s[0][0])
else : # 그 이상은 두 곡만
answer.append(s[0][0])
answer.append(s[1][0])
return answer
더 나은 풀이
def solution(genres, plays):
answer = []
d = {e:[] for e in set(genres)}
for e in zip(genres, plays, range(len(plays))):
d[e[0]].append([e[1] , e[2]])
genreSort =sorted(list(d.keys()), key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
for g in genreSort:
temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
answer += temp[:min(len(temp),2)]
return answer
가장 많은 좋아요를 받았던 코드.
프로그래머스는 코드의 가독성이 어떻던 간에
일단 짧으면 좋아요가 몰리는 경향이 있는데 (특히 파이썬)
이 코드는 그와 별개로 참 ‘파이썬스러워서’ 감탄했다.
언어의 특징을 잘 활용한다는게 여러모로 좋은 것 같다.
3번 라인 :
set함수를 이용해서 중복되는 장르명을 배제한 해시를 이미 완성.
리스트를 이용한 해시를 만들 땐 set을 쓰자…
4번 라인 :
복수의 list를 하나의 인덱스로 묶을 땐 zip을 쓰면 되는구나.
이것도 꼭 기억해두자.
6~9번 라인 :
… 공부하자!
댓글남기기