프로그래머스 베스트앨범 코드 및 해설 (파이썬)

2021. 4. 27. 14:08algorithm

반응형

programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

💡 2개의 딕셔너리(장르별 총 재생횟수, 장르별 노래의 고유번호 및 해당 노래의 재생횟수)를 이용해 풀이했습니다.

 

song_dict[장르] = [노래의 고유 번호, 재생 횟수]들의 리스트

genre_dict[장르] = 해당 장르의 총 재생 횟수

이렇게 두 가지 딕셔너리를 만들어 풀이했습니다.

 

우선 song_dict의 각 장르 내에서 재생 횟수가 많은 순으로 정렬했고, genre_dict도 value를 큰 값부터 정렬하여 총 재생횟수가 많은 장르의 순서를 알아냈습니다.


이후 총 재생 횟수가 많은 장르부터 각 장르 내에서 재생 횟수가 많은 2개씩 뽑아 그 노래의 고유번호를 answer에 추가하여 풀이했습니다.

 

from collections import defaultdict

def solution(genres, plays):
    answer = []
    
    # song_dict[장르] = [노래의 고유 번호, 재생 횟수]들의 리스트
    song_dict = defaultdict(list)
    for i, (genre, play) in enumerate(zip(genres, plays)):
        song_dict[genre].append([i, play]) 
    
    # genre_dict[장르] = 해당 장르의 총 재생 횟수 
    genre_dict = {}
    for genre in song_dict:
        # album_dict의 각 장르 내에서 재생 횟수가 많은 순으로 정렬 
        song_dict[genre].sort(key=lambda x: x[1], reverse=True)
        genre_dict[genre] = sum([song[1] for song in song_dict[genre]])
    
    # 총 재생 횟수가 많은 장르대로 정렬 
    genre_dict = dict(sorted(genre_dict.items(), key=lambda item: item[1], reverse=True))
    
    # 총 재생 횟수가 많은 장르부터 
    for genre in genre_dict:
        # 각 장르 내에서 재생 횟수가 가장 많은 2개씩 뽑아 해당 노래의 고유번호를 answer에 추가
        answer += [song[0] for song in song_dict[genre][:2]]
    
    return answer

 

반응형