[해시] 베스트앨범
https://programmers.co.kr/learn/courses/30/lessons/42579#
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
1. 인덱스가 key이고, 재생횟수가 value인 딕셔너리dic을 만든다. #{'0' : 500}
- {0: 500, 1: 600, 2: 150, 3: 800, 4: 2500}
2. 장르가 key이고, 재생횟수 리스트가 value인 딕셔너리 music_dic을 만든다.
- {'classic': [500, 150, 800], 'pop': [600, 2500]}
3. music_dic에 대해 값인 재생횟수 리스트를 내림차순으로 정렬한다.
- {'classic': [800, 500, 150], 'pop': [2500, 600]}
4. music_dic에 장르별 재생횟수의 총합을 내림차순으로 정렬한다.
- [('pop', [2500, 600]), ('classic', [800, 500, 150])]
5. 조건에 맞게 정렬된 music_dic을 차례로 돌며, 장르별 두개씩 추가, 만약 장르 내에서 재생횟수가 같은 노래가 있을 수 있으므로, temp리스트에 해당 재생횟수의 인덱스를 모두 찾아 추가 후, 인덱스 순으로 정렬 후 [:2]까지만 추가
- if not temp[0] in answer을 하는 이유는, 같은 인덱스 리스트를 중복추가하는 경우를 제외하기 위함이다.
def solution(genres, plays):
dic = {}
for i in range(len(plays)):
dic[i] = plays[i]
music_dic = {}
_ = 0
for i in genres:
music_dic.setdefault(i, [])
music_dic[i].append(dic[_])
_ += 1
for i in music_dic:
music_dic[i] = sorted(music_dic[i], reverse=True)
music_dic = sorted(music_dic.items(), key=lambda x: sum(x[1]), reverse=True)
answer = []
for i in range(len(music_dic)):
for j in list(music_dic[i][1][:2]):
temp = []
for k in dic:
if dic[k] == j:
temp.append(k)
if not temp[0] in answer:
answer += map(int, sorted(temp)[:2])
return answer