

def solution(genres, plays):
answer = list()
songs = dict()
for genre in set(genres):
songs[genre] = list()
for i in range(len(genres)):
songs[genres[i]].append(plays[i])
genres_sum = list()
for genre in songs.keys():
genres_sum.append((genre, sum(songs[genre])))
genres_sum.sort(reverse=True, key=lambda x : x[1])
for genre_sum in genres_sum:
genre = genre_sum[0]
play_list = sorted(songs[genre])
idx = plays.index(play_list.pop())
answer.append(idx)
plays[idx] = -1
if len(play_list) == 0:
continue
idx = plays.index(play_list.pop())
answer.append(idx)
return answer
songs에 genres와 plays에 대한 정보를 딕셔너리 형태로 담았다. 예시는 아래와 같다.
songs = {
"classic" : [500, 150, 800],
"pop" : [600, 2500]
}
genres_sum에는 튜플 (genre, 재생된 횟수 총합)의 리스트 형태로 담았다.
재생된 횟수 총합을 기준으로 정렬하여 노래 수록의 1번 기준을 따르도록 했다.
마지막 for문을 통해 2번과 3번 기준을 따르도록 했다.
재생된 횟수 리스트를 오름차순 정렬 후 pop()함으로써 최대 두 개의 앨범을 뽑았다.
두 앨범의 재생 횟수가 동일한 경우 같은 index를 출력할 수 있기에 뽑힌 후 -1로 값을 수정했다.
또한, 장르에 속한 곡이 한 곡인 경우를 고려해 중간 과정에 if문을 삽입하였다.
def solution(genres, plays):
answer = []
dic1 = {}
dic2 = {}
for i, (g, p) in enumerate(zip(genres, plays)):
if g not in dic1:
dic1[g] = [(i, p)]
else:
dic1[g].append((i, p))
if g not in dic2:
dic2[g] = p
else:
dic2[g] += p
for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
answer.append(i)
return answer
zip() 사용enumerate() 사용깔끔하고 가독성도 좋은 코드... 짱이다! 나도 꾸준히 연습해야지.
모두 아는 문법이었지만 알고리즘의 차이.
코드를 최적화하는 연습을 하자.