본문 바로가기
Algorithm/programmers

[프로그래머스] 42579 | 베스트앨범

by 밤초록 2022. 1. 18.
42579 | 베스트앨범
Level 3
https://programmers.co.kr/learn/courses/30/lessons/42579

 

 

 

작성 코드

 

from collections import defaultdict


def solution(genres, plays):
    answer = []
    genre_play = defaultdict(list)
    genre_play_sum = defaultdict(int)

    for idx, genre in enumerate(genres):
        genre_play[genre].append([idx, plays[idx]])
        genre_play_sum[genre] += plays[idx]

    sorted_genre_play_sum = sorted(genre_play_sum.items(), key = lambda x: x[1], reverse=True)
    for genre in genre_play:
        genre_play[genre] = sorted(genre_play[genre], key = lambda x: x[1], reverse=True)

    for genre in sorted_genre_play_sum:
        answer.append(genre_play[genre[0]][0][0])
        if len(genre_play[genre[0]]) >= 2:
            answer.append(genre_play[genre[0]][1][0])

    return answer

 

  • genre_play - list 형 defaultdict, genre를 key 값으로 [고유번호, 재생 횟수] 를 value 값으로
  • genre_play_sum - int 형 defaultdict, genre를 key 값으로 합을 value로

 

  • genre_play - value[1] (재생 횟수) 값으로 정렬
  • genre_play_sum - value 값으로 정렬

 

  • 장르 내 인기 많은 곡 최대 두 곡까지 수록할 수 있음 -> 첫 번째 곡은 무조건 수록, 길이가 2 이상이라면 두 번째 곡도 수록

 

이상 코드

 

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):
        print(k, v)
        for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)

    return answer

 

  • 생각보다 본인이 작정한 코드와 큰 차이는 없음
  • 코드가 간결해짐
  • list 길이가 slicing 할 길이보다 적어도 오류는 안 뜸

 

 

학습

 

  • 배열끼리 값을 묶어서 계산할 때 index 기준으로 하기 보다는 zip 사용하는 것이 가독성 좋음
  • list slicing 할 때 그냥 [:2] 해줘도 됨
a = [1]
print(a[:2])

 

  • min(len(dict1[k]), 2) 해줘도 되지만 코드가 길어짐
반응형

댓글