[Level3] 베스트앨범

🛠 문제

https://programmers.co.kr/learn/courses/30/lessons/42579


👩🏻‍💻 해결 방법

어려운 문제는 아니지만, 구현 과정에서 많이 헷갈리는 문제였다
딕셔너리에 저장할 때, genres_total_play와 genres_dict를 한 번에 저장할 수 있도록 생각하는 것이 필요했다...
장르 내에서 많이 재생된 노래를 먼저 수록하고(역순), 만약 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록하기 위해 key = lambda x:(-x[0], x[1])을 사용하였다

소스 코드

def solution(genres, plays):
    answer = []
    genre_total_play = {}
    genre_dict = {}
    
    for i in range(len(genres)):
        if genres[i] not in genre_total_play.keys():
            genre_total_play[genres[i]] = plays[i]
            genre_dict[genres[i]] = [(plays[i], i)]
        else:
            genre_total_play[genres[i]] += plays[i]
            genre_dict[genres[i]].append((plays[i], i))
    
    sorted_total_play = sorted(genre_total_play.items(), key = lambda x:x[1], reverse = True)
    
    for i in sorted_total_play:
        play_list = genre_dict[i[0]]
        play_list = sorted(play_list, key = lambda x:(-x[0], x[1]))
        
        for j in range(len(play_list)):
            if j == 2:
                break
            answer.append(play_list[j][1])
    return answer

💡 다른 사람의 풀이

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

좋은 웹페이지 즐겨찾기