문제

[프로그래머스] 베스트앨범 (LV. 3)

요약

  • 각 노래의 장르와 재생 횟수가 주어진다. 장르별로 가장 많이 재생된 두 곡을 뽑아 베스트 앨범을 구성하려고 한다.
  • 다음 규칙에 따라 노래를 선곡해 반환하자.
    1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
    2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
    3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

분류

  • 해시

풀이

1. 내 풀이

  • 장르별 재생 횟수를 구하는 딕셔너리와, 장르별로 곡의 재생수와 고유번호를 저장하는 딕셔너리를 만든다.
  • 장르별 재생 횟수에 따라, 장르별 곡들 중 두 개(혹은 하나)를 뽑는다. 고유 번호를 answer에 append 한다.


from collections import defaultdict

def solution(genres, plays):
    musics = defaultdict(list)
    genres_play_total = defaultdict(int)

    i = 0
    for genre, play in zip(genres, plays):
        genres_play_total[genre] += play
        musics[genre].append([play, i])
        i += 1

    for val in musics:
        musics[val].sort(key = lambda x: (-x[0], x[1]))
        musics[val] = musics[val][:2]

    result = []
    for genres, _ in sorted(genres_play_total.items(), key = lambda x : -x[1]):
        result += [musics[genres][0][1], musics[genres][1][1]] if len(musics[genres]) >= 2 else [musics[genres][0][1]]


    return result

<리팩터링>

아래와 같은 코드를

result += [musics[genres][0][1], musics[genres][1][1]] if len(musics[genres]) >= 2 else [musics[genres][0][1]]

이렇게 정리했다.

result += [music[1] for music in musics[genres][:2]]

더 짧고, 읽기도 쉽다. 기억해두자.