문제
문제 설명
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르
를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.
제한사항
- genres[i]는 고유번호가 i인 노래의 장르입니다.
- plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
- genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
- 장르 종류는 100개 미만입니다.
- 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
- 모든 장르는 재생된 횟수가 다릅니다.
코드
from collections import defaultdict
def solution(genres, plays):
answer = []
play_list = [] #index, genre, play 모두 저장할 리스트
genre_list = defaultdict(list) #장르별 play 저장
for index, (genre, play) in enumerate(zip(genres, plays)):
play_list.append((index, genre, play))
genre_list[genre].append(play)
#play 수를 기준으로 내림차순 정렬
play_list.sort(key = lambda x: x[2], reverse = True)
#genre의 전체 플레이수 기준으로 내림차순 정렬
genre_list = sorted(genre_list.items(), key = lambda x: sum(x[1]), reverse = True)
for genre in genre_list:
cnt = 0
for idx, genre_, play in play_list:
if cnt == 2: #genre별 최대 2개의 곡만 뽑는다
break
if genre[0] == genre_: #현재 genre와 같으면 해당 index 저장
answer.append(idx)
cnt += 1
return answer
진행 과정
예제 #1
genres = ["classic", "pop", "classic", "classic", "pop"]
plays = [500, 600, 150, 800, 2500]
1) play_list = [], genre_list = defaultdict(list)
2) play_list = [(0, 'classic', 500), (1, 'pop', 600), (2, 'classic', 150), (3, 'classic', 800), (4, 'pop', 2500)]
genre_list = {'classic': [500, 150, 800], 'pop': [600, 2500]})
3) play_list = [(4, 'pop', 2500), (3, 'classic', 800), (1, 'pop', 600), (0, 'classic', 500), (2, 'classic', 150)] #내림차순 정렬
genre_list = [('pop', [600, 2500]), ('classic', [500, 150, 800])] #내림차순 정렬
4) answer = [4, 1] #플레이수가 가장 높은 "pop"부터 추가
5) answer = [4, 1, 3, 0] #그 다음으로 플레이수가 높은 "classic" 추가
해당 문제를 풀이할 수 있는 방법은 다양하니 한번 다른 사람들의 풀이도 확인해보길 권한다.
'Algorithm & Data Structure > Programmers' 카테고리의 다른 글
[Programmers]Python_외벽 점검 (0) | 2020.12.17 |
---|---|
[Programmers]Python_기둥과 보 설치 (0) | 2020.12.16 |
[Programmers]Python_순위 (0) | 2020.12.11 |
[Programmers]Python_등굣길 (0) | 2020.12.10 |
[Programmers]Python_이중우선순위큐 (0) | 2020.12.09 |