
문제
- 프로그래머스 알고리즘 문제
베스트앨범- 문제 내용 : [링크]
내가 작성한 코드
from collections import defaultdict
def solution(genres, plays):
answer = []
Ha = defaultdict(list)
Hb = defaultdict(int)
for i, (x, y) in enumerate(zip(genres, plays)):
Ha[i].append(x)
Ha[i].append(y)
Hb[x] += y
# Ha = {0: ['classic', 500], 1: ['pop', 600], 2: ['classic', 150], 3: ['classic', 800], 4: ['pop', 2500]}
# Hb = {'classic': 1450, 'pop': 3100}
s_gen = (sorted(Hb.items(), key = lambda x:-x[1]))
s_de = (sorted(Ha.items(), key = lambda x: (-x[1][1], x[0])))
# s_gen = [('pop', 3100), ('classic', 1450)]
# s_de = [(4, ['pop', 2500]), (3, ['classic', 800]), (1, ['pop', 600]), (0, ['classic', 500]), (2, ['classic', 150])]
for x in s_gen:
cnt = 0
for y in s_de:
if y[1][0] == x[0]:
answer.append(y[0])
cnt += 1
if cnt == 2:
break
return answer
# [4, 1, 3, 0]
각각 장르, 곡 별 정보의 데이터를 활용해야 하므로, 딕셔너리 형태로 데이터를 저장하고 접근
defaultdict 함수를 이용하여 Ha에는 곡 고유번호별 장르와 플레이 횟수를 리스트 형태의 Value로 저장하고, Hb에는 곡 장르별 총 플레이 횟수를 저장한다.
Hb의 플레이 횟수가 큰 순으로 내림차순 정렬한 tuple 값들을 모아놓은 리스트를 s_gen으로 만들어준다.
Ha의 플레이 횟수가 큰 순으로 내림차순, 같은 플레이 횟수를 가질 때 앞 번호의 고유번호가 오도록 고유번호별 오름차순 정렬해 tuple 값들을 모아놓은 리스트를 s_de로 만들어준다.
s_gen 총 플레이 횟수가 많은 곡 장르 순서대로, 각 곡의 플레이 횟수가 많은 곡 상위 2개의 고유번호를 answer에 append 해 준다. 장르별로 cnt 값을 설정하여, cnt = 2가 되면 더 이상 answer에 곡이 포함되지 않도록 한다.