https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
생각하기
- 먼저 장르에 따라 dictionary에 해당 장르에 속하는 노래 idx를 분류
- 각 장르 딕셔너리를 돌면서 장르별 play 횟수를 counting
- 가장 높은 play 횟수를 가진 장르부터 각 노래 plays와 idx 기준으로 정렬
- 정렬된 list를 answer에 추가
구현하기
dictionary : {장르 : [idx의 리스트]} 로 구성된 dictionary
plays_count : {장르 : 장르에 속한 노래들의 plays 합} 로 구성된 dictionary
sorted_count : plays_count를 2번째 인자 기준으로 내림차순 정렬한 튜플 (dictionary를 정렬할 때, 튜플로 변환하기 때문에 튜플을 반환)
유의점
각 장르내에서 노래들을 정렬할 때의 문제에서 제시한 규칙은 아래와 같다
해당 부분을 sort할 때, 잘못 세팅해줘서 조금 시간이 걸렸다
- 장르 내에서 가장 많이 재생된 노래 : 내림 차순
- 재생된 노래가 같은 경우 idx 오름차순
두개의 기준이 다르므로 한쪽에 - 를 붙여주어야 한다
dictionary[g[0]].sort(key = lambda x : (plays[x], -x), reverse=True)
sort의 기본 정책은 내림차순 (reverse=True)이고 이에 따라 plays[x] 즉, 노래 재생 횟수에 따라 1차적으로 내림차순 정렬된다
하지만 같은 재생 횟수일 때는, idx 기준으로 내림차순 정렬되어야 하므로
idx들을 음수로 인식하게 하여서 정렬을 시킨다
def solution(genres, plays):
dictionary = {}
plays_count = {}
for i in range(len(genres)):
if genres[i] in dictionary :
dictionary[genres[i]].append(i)
else:
dictionary[genres[i]] = [i]
if genres[i] in plays_count :
plays_count[genres[i]] += plays[i]
else:
plays_count[genres[i]] = plays[i]
# print(dictionary)
# print(count)
sorted_count = sorted(plays_count.items(), key = lambda x : x[1], reverse=True)
# print(sorted_count)
answer = []
# 속한 노래가 많이 재생된 장르?
for g in sorted_count:
# 장르 내에서 많이 재생된 노래
# 장르 내에서 재생횟수가 같은 노래 중에서는 id 낮은 노래
dictionary[g[0]].sort(key = lambda x : (plays[x], -x), reverse=True)
# print(dictionary[g[0]])
answer += dictionary[g[0]][0:2]
return answer