알고리즘 유형 : 해시
풀이 참고 없이 스스로 풀었나요? : O
https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3
직접 푼 풀이
def solution(genres, plays):
answer = []
cluster = {}
for idx in range(len(genres)):
key = genres[idx]
if key in cluster:
cluster[key].append((idx, plays[idx]))
else:
cluster[key] = [(idx, plays[idx])]
genres_sorted = []
for key in cluster.keys():
genres_sorted.append((key, sum([x[1] for x in cluster[key]])))
genres_sorted = sorted(genres_sorted, key = lambda x: -x[1])
for key, _ in genres_sorted:
musics = sorted(cluster[key], key = lambda x: -x[1])
for item in musics[:2]:
answer.append(item[0])
return answer
딕셔너리의 items()를 활용한 정렬과 enumerate, zip, defaultdict를 이용한 간결한 풀이
from collections import defaultdict
def solution(genres, plays):
answer = []
genres_order = defaultdict(int)
genres_plays = defaultdict(list)
for i, (genre, v) in enumerate(zip(genres, plays)):
genres_order[genre] += v
genres_plays[genre].append((i, v))
for genre, _ in sorted(genres_order.items(), key = lambda x: x[1], reverse = True):
for i, v in sorted(genres_plays[genre], key = lambda x: x[1], reverse = True)[:2]:
answer.append(i)
return answer
SOLVE 1) 풀이 요약 (직접 푼 풀이)
SOLVE 2 풀이 요약 (딕셔너리의 items()를 활용한 정렬과 enumerate, zip, defaultdict를 이용한 간결한 풀이)
위를 for로 순회하면서, genres_order에는 장르 별(key) 총 재생 횟수를 key-value 쌍으로 저장하고, genres_plays에는 장르 별(key) (고유 번호, 재생 횟수)의 튜플 쌍을 저장한다.
이 때 특정 키가 딕셔너리에 존재하지 않으면, genres_order의 경우 그 키의 밸류를 0으로 할당해주고 이어서 v를 더해주고, genres_plays의 경우 그 키의 밸류를 빈 리스트로 할당해주고 거기에 append 해주기 위해 defaultdict 모듈을 사용하여 코드를 간략하게 작성할 수 있다.
이중 for문을 작성한다.
genres_order의 items를, 두 번째 요소인 총 재생 횟수를 기준으로 내림차순 정렬한 것을 순회한다.
그 안에서, 순회 중인 key(genre)에 대해 genres_plays[genre], 즉 (고유 번호, 재생 횟수) 튜플이 모여있는 리스트를 재생 횟수를 기준으로 내림차순 정렬한 것을 순회하며 고유 번호를 answer에 append해준다.
배운 점, 어려웠던 점