베스트앨범 문제 바로가기

나의 풀이

def solution(genres, plays):
    playlist = {}
    count = {}
    for idx, (g, p) in enumerate(zip(genres, plays)):
        if g in playlist:
            playlist[g].append((p,idx))
            count[g] += p
        else:
            playlist[g] = [(p,idx)]
            count[g] = p
            
    ans = []
    for g in sorted(count.items(), reverse=True, key=lambda x:x[1]):
        for p in sorted(playlist[g[0]], reverse=True, key=lambda x:x[0])[:2]:
            ans.append(p[1])
    
    return ans

고수의 풀이

def solution(genres, plays):
    answer = []
    d = {e:[] for e in set(genres)}
    for e in zip(genres, plays, range(len(plays))):
        d[e[0]].append([e[1] , e[2]])
    genreSort =sorted(list(d.keys()), key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
    for g in genreSort:
        temp = [e[1] for e in sorted(d[g],key= lambda x: (x[0], -x[1]), reverse = True)]
        answer += temp[:min(len(temp),2)]
    return answer

출처

CODE REVIEW

  1. 멜x, 벅x, 스x티파이와 같은 음원 프로그램에서 쓸 법한 정렬 문제. 총 재생수로 genres를 정렬한 후에, 그 장르별로 많이 재생한 2개의 항목의 번호를 출력해야했다.
  2. 코드의 큰 구조는 1) genres, plays를 묶어서 dict로 만드는 과정2) 앞에서 생성한 dict을 알맞게 정렬하는 과정로 구성된다.
  3. dict를 정렬할 떄에는 sort를 사용하지 못하고 sorted()로 묶어서 사용해야한다.
  4. 비슷한 논리지만 다른 형태인 고수의 풀이도 참고하자!