# genres = ["classic", "pop", "classic", "classic", "pop"], plays = [500, 600, 150, 800, 2500] -> [4, 1, 3, 0]
# classic 장르는 1,450회 재생되었으며, classic 노래는 아래와 같음
# - 고유 번호 3: 800회 재생
# - 고유 번호 0: 500회 재생
# - 고유 번호 2: 150회 재생
# pop 장르는 3,100회 재생되었으며, pop 노래는 아래와 같음
# - 고유 번호 4: 2,500회 재생
# - 고유 번호 1: 600회 재생
# -> pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록
# (장르 별로 가장 많이 재생된 노래를 최대 두 개까지 모아 베스트 앨범을 출시하므로 pop 장르의 2번 노래는 수록되지 x)
# => [4, 1, 3, 0]
## 의사코드 ##
# 노래의 고유 번호 -> index
# 해시 -> dict()
# 장르별 노래의 고유 번호와 재생 횟수를 담을 genre_dict = defaultdict(list)
# 장르별 총 재생 횟수를 담을 total_play = defaultdict(lambda:0)
# for i, (g, p) in enumerate(zip(genres, plays)):
# 먼저, 장르를 dict의 key로, value는 [(노래의 고유 번호(i), plays[i])]로 설정
# genre_dict[g].append((i, p))
# 장르별로 총 재생 횟수를 구함
# total_play[g] += p
# 장르별 총 재생 횟수가 높은 순으로 장르를 정렬
# 장르 내에서 재생 횟수가 높은 노래를 2개까지 선택해서 answer에 append
# (장르에 속한 곡이 1개인 경우 -> 곡 1개만 선택)
# (재생 횟수가 같은 노래들이 있으면 고유 번호(index)가 낮은 노래부터 선택)
통과한 코드
from collections import defaultdict
def solution(genres, plays):
answer = []
genre_dict = defaultdict(list) # 장르별 노래의 고유 번호와 재생 횟수를 담은 딕셔너리
total_play = defaultdict(lambda:0) # 장르별 총 재생 횟수를 담은 딕셔너리
for i, (g, p) in enumerate(zip(genres, plays)):
genre_dict[g].append((i, p)) # {genre1: [(노래의 고유 번호(i), plays[i]), ...], genre2: [(노래의 고유 번호(i), plays[i]), ...], ...}
total_play[g] += p # {genre1: 총 재생 횟수, genre2: 총 재생 횟수, ...}
# 장르별 총 재생 횟수가 높은 순으로 장르를 정렬
for k, v in sorted(total_play.items(), key=lambda x:x[1], reverse=True):
# 정렬된 장르의 순서대로 장르 내에서 재생 횟수가 높은 노래를 2개까지 선택
for i, p in sorted(genre_dict[k], key=lambda x:x[1], reverse=True)[:2]:
answer.append(i)
return answer
-> defaultdict를 활용해서 장르별 정보를 담을 딕셔너리와 장르별 총 재생 횟수를 담을 딕셔너리를 따로 생성
장르 내에서 재생 횟수가 같은 노래 중에서 고유 번호가 낮은 노래가 먼저 수록
# 장르 내에서 재생 횟수가 같은 노래 중에서 고유 번호가 낮은 노래가 먼저 수록되는지 테스트
from collections import defaultdict
genres = ["classic", "pop", "classic", "classic", "pop", "classic"]
plays = [500, 600, 150, 800, 2500, 500]
genre_dict = defaultdict(list)
total_play = defaultdict(lambda:0)
for i, (g, p) in enumerate(zip(genres, plays)):
genre_dict[g].append((i, p))
total_play[g] += p
print(sorted(genre_dict['classic'], key=lambda x: x[1], reverse=True))
"""
[(3, 800), (0, 500), (5, 500), (2, 150)]
"""