코딩테스트/python

[programmers/python] 베스트앨범 (defaultdict 활용)

zyin 2025. 5. 24. 23:12

문제 조건

- url : https://school.programmers.co.kr/learn/courses/30/lessons/42579

  1. 속한 노래가 많이 재생된 장르를 먼저 수록한다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록한다.
  3. 재생 횟수가 같으면 고유 번호가 낮은 노래를 먼저 수록한다.
  4. 장르별로 최대 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]