문제
장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다.
노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
1) 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
2) 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3) 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때,
베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return
(출처 : 프로그래머스)
입출력 예
genres | plays | return |
["classic", "pop", "classic", "classic", "pop"] | [500, 600, 150, 800, 2500] | [4, 1, 3, 0] |
classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.
고유 번호 3: 800회 재생
고유 번호 0: 500회 재생
고유 번호 2: 150회 재생
pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.
고유 번호 4: 2,500회 재생
고유 번호 1: 600회 재생
따라서 pop 장르의 [4, 1]번 노래를, classic 장르의 [3, 0]번 노래를 차례대로 return 합니다.
풀이
from collections import defaultdict as dd
def solution(genres, plays):
answer = []
gcac=dd(int) #calc
gd=dd(list) #dict
for i,v in enumerate(genres):
gcac[v]+=plays[i]
gd[v].append((i,plays[i]))
gcac=sorted(gcac.items(),key=lambda x:x[1], reverse=True) #장르:플레이수합
#print('gcac: ',gcac)
for name,total in gcac:
gd[name]=sorted(gd[name],key=lambda x:x[1],reverse=True)
#print('gd[',name,']',gd[name]) #[(4, 2500), (1, 600)]
for idx in range(2):
if idx==len(gd[name]): break
answer.append(gd[name][idx][0])
return answer
int형 defaultdict를 선언해 장르별 플레이 횟수를 집계했고 (gcac)
list형 defaultdict에 plays 배열의 장르별 플레이 횟수와 인덱스를 넣어주었다. (gd)
gcac을 플레이 횟수가 많은 순으로 정렬한 뒤
gd에 플레이를 많이한 장르부터 접근해 리스트를 플레이 수 역순으로 정렬했다.
리스트 정렬 후 최대 2개까지 정렬된 리스트에서 인덱스를 answer에 추가해주었다.
'Problem Solving > Programmers' 카테고리의 다른 글
프로그래머스 (Level 2) : 프로세스/ Python, deque (0) | 2023.04.27 |
---|---|
프로그래머스 (Level 3) : 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기/ (SQL) Oracle/ WITH, JOIN (0) | 2023.04.25 |
프로그래머스 (Level 2) : 구명보트/ C++, Python, Greedy (2) | 2022.10.11 |
프로그래머스 (Level 3) : 정수 삼각형/ C++, DP/ vector 최대값 *max_element, greater<>() (4) | 2022.10.11 |
프로그래머스 (Level 4) : 그룹별 조건에 맞는 식당 목록 출력하기/ (SQL) MySQL, Oracle/ JOIN, RANK() (0) | 2022.10.10 |