본문 바로가기

알고리즘/프로그래머스

[프로그래머스] 해시 - 베스트앨범, 파이썬

문제


풀이


요구 능력

  • 레벨 3
  • 해시, 딕셔너리, 정렬

  • 문제의 요구사항을 따라가다보면 그다지 어려운 문제는 아니다.
  • 다만 주의해야할 점은 파이썬 딕셔너리에서 sort()를 제공하지 않아 정렬을 위해 내장함수인 sorted()를 사용해야한다.
  • 왜지?? 라는 생각이 들텐데 위에 대한 내용은 시간여유가 있으면 정리해봐야겠다. (= 시간이 없어 대충 풀어제낌 ㅠ)
  • 밑에 코드는 좀 더 깔끔하게 정리 가능하다.(= 지저분하단 소리)

코드


from collections import defaultdict

def solution(genres, plays):
    answer = []
    dic_lst = defaultdict(list)
    dic_n = defaultdict(int)
    arr = []
    # dic_n 딕션리에 장르를 키로 플레이된 수를 다 더해준다
    # dic_lst에는 재생된 곡의 [재생 수, 고유번호]를 리스트로 더해준다. 
    for i, genre in enumerate(genres) :
            dic_lst[genre].append([plays[i], i])
            dic_n[genre] += plays[i]
    # arr 리스트에 [총 재생 수, 장르]를 가장 많이 재생된 순서대로 저장해준다.          
    for key in dic_n :
        arr.append([dic_n[key], key])
    arr.sort(reverse = True)
    #모든 장르에 대하여 가장 많이 재생된 순서로(arr) 고유번호는 낮은 순대로, 재생수는 높은 순대로 최대 2곡까지 고유번호를 answer에 담는다. 
    for g in arr :
        genre = g[1]
        temp = sorted(dic_lst[genre], key = lambda x: (-x[0], x[1]))
        for song in temp[:2] :
            answer.append(song[1])
    return answer