코딩테스트/python
[programmers/python] 베스트앨범 (defaultdict 활용)
zyin
2025. 5. 24. 23:12
문제 조건
- url : https://school.programmers.co.kr/learn/courses/30/lessons/42579
- 속한 노래가 많이 재생된 장르를 먼저 수록한다.
- 장르 내에서 많이 재생된 노래를 먼저 수록한다.
- 재생 횟수가 같으면 고유 번호가 낮은 노래를 먼저 수록한다.
- 장르별로 최대 2곡까지 수록한다.
예시 입력
genres = ["classic", "pop", "classic", "classic", "pop"]
plays = [500, 600, 150, 800, 2500]
이 경우 베스트 앨범에 수록할 곡은 [4, 1, 3, 0]이 된다.
풀이 전략
- 장르별로 고유 번호를 모은다 → defaultdict(list)
- 장르별로 총 재생 횟수를 계산한다 → defaultdict(int)
- 장르 전체를 재생 횟수 기준으로 정렬한다
- 각 장르 안에서 곡을 정렬하여 최대 2개만 선택한다
구현 코드
from collections import defaultdict
def solution(genres, plays):
genres_zip = defaultdict(list) # 장르별 곡 고유번호 리스트
genres_sum = defaultdict(int) # 장르별 총 재생 수
for i, g in enumerate(genres):
genres_zip[g].append(i)
genres_sum[g] += plays[i]
def sortKey(i):
play = plays[i]
return (-play, i) # 재생 수 내림차순, 고유 번호 오름차순
answer = []
sorted_genres = sorted(set(genres), key=lambda g: genres_sum[g], reverse=True)
for g in sorted_genres:
sorted_plays = sorted(genres_zip[g], key=sortKey)
answer += sorted_plays[:2]
return answer
예시 출력
solution(["classic", "pop", "classic", "classic", "pop"], [500, 600, 150, 800, 2500])
# 출력: [4, 1, 3, 0]