# 파이썬의 내장 모듈인 collections의 defaultdict 클래스를 사용해 기본값을 넣어주면 된다.
# defaultdict 클래스의 생성자로 기본값을 생성해주는 함수를 넘기면, 모든 키에 대해서 값이
# 없는 경우 자동으로 생성자의 인자로 넘어온 함수를 호출하여 그 결과값으로 설정해준다.
# 정말 중요한점!! dic는 sort는 안먹어도 sorted로 해결이 가능하다.
from collections import defaultdict
def solution(genres, plays):
answer = []
genre_dic = defaultdict(lambda: 0) # 이 부분 아주 중요 dic는 꼭 이렇게 선언
total_list = defaultdict(lambda: []) # 이 부분 아주 중요 dic에 리스트값을 append하고 싶으면 꼭 이렇게
for i in range(len(genres)):
genre_dic[genres[i]] += plays[i] # 이렇게 넣어주는 것도 외우기
total_list[genres[i]].append((plays[i], i)) # 이렇게 넣어주는 것도 외우기
genre_dic = sorted(genre_dic.items(), key=lambda x:x[1], reverse=True) # 이 부분 아주 중요 이렇게 함으로써 genre_dic는 리스트로 변경 됨 한마디로 dic가 리스트로 변경하게 하는 방법임
for i in total_list:
total_list[i] = sorted(total_list[i], key=lambda x:x[0], reverse=True) # 이 부분 아주 중요
while len(genre_dic) > 0:
genre_max = genre_dic.pop(0)
for t in total_list:
if t == genre_max[0]:
if len(total_list[t]) > 1:
answer.append(total_list[t][0][1])
answer.append(total_list[t][1][1])
else:
answer.append(total_list[t][0][1])
return answer
문제의 핵심은 dic를 얼마나 잘 사용하느냐를 물어보는 문제 이다. 꼭 노래장르의 dic인 genres_dic와 total_list는 defaultdict를 선언하여 dic를 형성하고 각 장르의 값의 plays에 들어있는 합을 genres_dic에 넣어준다. 그리고 안을 리스트로 넣을 수 있는 total_list에 각 장르별 plays[i]와 그의 index를 append 시켜준다. 그 후 genres_dic를 sorted함수를 사용하여 안의 값을 내림차순으로 정렬한 후 dic를 리스트로 변경시켜준다.
비슷하게 total_list의 안의 값을 sorted로 내림차순 한 후 내림차순 된 genres_dic의 [0]번째 인덱스를 기준으로 pop하며 값이 1보다 많이 있는 장르는 상위 2개의 인덱스를 answer에 append하며 그것이 아닐 경우 하나의 인덱스만 answer에 append한다.