문제

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번 라인 :
… 공부하자!

댓글남기기