1. 문제
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
- 노래의 장르를 나타내는 문자열 배열 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] |
원본 링크 : https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3
2. 풀이
songdict = {}
for i in range(len(genres)):
if genres[i] not in songdict.keys():
songdict[genres[i]]=[(plays[i],i)]
else:
songdict[genres[i]].append((plays[i],i))
for item in songdict.items():
songdict[item[0]]=sorted(item[1],key=lambda x:(-x[0],x[1]))
songlist_sorted=[]
for item in songdict.items():
sum=0
for i in range(len(item[1])): sum += item[1][i][0]
songlist_sorted.append((item[0],sum))
songlist_sorted.sort(key=lambda x:x[1],reverse=True)
for i in range(len(songlist_sorted)):
if len(songdict[songlist_sorted[i][0]]) == 1:
answer.append(songdict[songlist_sorted[i][0]][0][1])
else:
answer.append(songdict[songlist_sorted[i][0]][0][1])
answer.append(songdict[songlist_sorted[i][0]][1][1])
