본문 바로가기
🖥️ 문제 풀이/프로그래머스

[프로그래머스] Lv3 - 베스트앨범

by 뒬탕 2022. 9. 27.
반응형

프로그래머스 해답 및 해설

 

문제 : 베스트앨범

바로가기

 

문제 설명

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

1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.

 

제한 조건

  • genres[i]는 고유번호가 i인 노래의 장르입니다.
  • plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
  • genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
  • 장르 종류는 100개 미만입니다.
  • 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
  • 모든 장르는 재생된 횟수가 다릅니다.

 

입출력 예

genres plays return
["classic", "pop", "classic", "classic", "pop"] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

 

해답 및 해설

파이썬 (Python)

from operator import itemgetter

def solution(genres, plays):
    # (장르, 재생수, 인덱스) 튜플 모음으로 리스트 만들어줌
    zip_song = zip(genres , plays, range(len(plays)))
    
    # 그 후 재생수 내림차순으로 정렬
    zip_song = sorted(zip_song, key=itemgetter(1), reverse=True)
    
    total_dic = {}
    count_dic = {}
    
    # 사전을 2개 만들어 한 사전에는 총 재생수, 다른 사전에는 인덱스들을 순서대로 저장
    for genre, count, index in zip_song:
        if genre in total_dic:
            total_dic[genre] += count
            count_dic[genre].append(index)
        else:
            total_dic[genre] = count
            count_dic[genre] = [index]
    
    answer = []
    # 사전 key들을 총 재생수 순으로 정렬한 다음
    total_sort = sorted(total_dic.keys(), key=lambda x : total_dic[x], reverse=True)
    
    # 각 장르에서 2개씩 뽑아옴
    for x in total_sort:
        answer += count_dic[x][:2] # 범위 벗어나도 되서 다행
        
    return answer

 우선 장르, 재생수, 인덱스를 하나로 묶어 튜플로 만든 다음, zip을 이용하여 리스트에 넣어주었다. 그 후 재생수가 가장 많은 순서대로 정렬해주었다. 이 과정에서 operator 라이브러리에서 itemgetter 함수를 이용해주었다. itemgetter함수는 callable 객체에서 해당 인덱스 값을 불러온다. lambda arr: arr[x]와 비슷하다고 보면 될 거 같다.

 

그리고 사전을 2개 만들어 한쪽에는 총 재생수, 다른 쪽에는 재생수별 인덱스를 저장해놓는다. 그리고 사전의 key를 총 재생수가 가장 많은 순서대로 정렬한다.

 

마지막으로 재생수 순으로 정렬한 장르 리스트로 반복문을 돌려 각 장르별 곡 2곡을 뽑아온다. 여기서 파이썬이라 다행인 점이 [:2]와 같이 인덱싱을 해도 원소가 1개일 때 오류가 나지 않았다는 점이다. 

반응형

댓글