문제
요약
- 각 노래의 장르와 재생 횟수가 주어진다. 장르별로 가장 많이 재생된 두 곡을 뽑아 베스트 앨범을 구성하려고 한다.
- 다음 규칙에 따라 노래를 선곡해 반환하자.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
분류
- 해시
풀이
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]]
더 짧고, 읽기도 쉽다. 기억해두자.