from collections import defaultdict
def solution(genres, plays):
answer = []
genre_play_total_cnt = defaultdict(lambda: 0)
for genre, play in zip(genres, plays):
genre_play_total_cnt[genre] += play
genre_rank = [genre for genre, play in sorted(genre_play_total_cnt.items(), key = lambda x:x[1], reverse=True)]
genre_play = defaultdict(lambda: [])
for i in range(0, len(genres)):
genre_play[genres[i]] += [[i, plays[i]]]
for genre in genre_rank:
result = sorted(genre_play[genre], key = lambda x: (x[1]), reverse=True)
if len(result) > 1:
answer.append(result[0][0])
answer.append(result[1][0])
else :
answer.append(result[0][0])
return answer
이 문제는 dict와 list를 자유자재로 사용할 줄 알아야 풀기 쉬웠다(풀기 어려웠단 의미). 풀이를 참고해서 풀어서 사실 풀었다고 말할 수 없다.
전체적인 흐름을 파악하자면,
1.먼저 장르 별 재생횟수의 총 합을 구한다(genre_play_total_cnt).
2. 이 dict를 가지고 정렬을 통해 재생순위별로 정렬된 genre_rank를 구한다.
3. 장르별 인덱스와 재생횟수를 저장하는 genre_play 딕셔너리를 만든다.
4. 해당 딕셔너리를 재생횟수로 내림차순 정렬하고, 2개 혹은 1개씩 넣어준다.
(genre_rank를 구할 때 dict.items()라는 함수가 사용되었는데, Key, Value 쌍을 dict_items 객체로 반환하는 함수이다. 이 객체는 리스트와 동일하게 사용이 가능하다.)
이 때 주의할 점은 sort시에 lambda x: (x[1], x[0])를 넣으면 인덱스도 내림차순으로 정렬되어 답이 틀리게 된다(1차 시도 그래서 실패함, 인덱스 오름차순인 것에 유의). 또, result 리스트가 항상 2개 이상이 아닐 수 있다. 따라서 무작정 2개씩 넣었다간 런타임에러가 날 수 있다(2차 시도 실패함).
이 문제는 딕셔너리, 리스트 정렬에 익숙해지기 좋은 문제라고 생각한다. 까먹기 전에 또 한번 풀어봐야겠다.