본문 바로가기

취업과 기본기 튼튼/코딩 테스트 노트

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

문제

베스트 앨범 (https://programmers.co.kr/learn/courses/30/lessons/42579?language=python3#)

풀이

1. 초기 접근

  • 문제 조건 해석
    • 속한 노래가 많이 재생된 장르를 먼저 수록합니다 -> 장르별로 먼저 묶어서 정렬해야 한다.
    • 장르 내에서 많이 재생된 노래를 먼저 수록합니다. -> 장르 내에서도 정렬해야 한다.
  • 코드 (python)
from operator import itemgetter

def solution(genres, plays):
    answer = []
    d = {}

    # make set according to genre.
    for i in range(0, len(genres)) :
        if genres[i] not in d :
            d[genres[i]] = []
            d[genres[i]].append(0);
        d[genres[i]].append( (i, plays[i]) );
        d[genres[i]][0] += plays[i];

    # now d is
    # d = { 'classic': [1450,(0, 500), (2, 150), (3, 800)], 
    #       'pop': [3100, (1, 600), (4, 2500)] }

    # sort set on descending order.
    a = list(d.values())
    a.sort(key=itemgetter(0), reverse=True)

    # now a is
    # a = [ [3100, (1, 600), (4, 2500)],
    #       [1450, (0, 500), (2, 150), (3, 800)] ]

    # pop the most played genre.
    # and selecte the most played two songs.
    while a :
        max = -1
        # remove total sum of the genre played.
        a[0].pop(0)

        # sort by number played on increasing order.
        a[0].sort(key=itemgetter(1), reverse=True) 

        # extract top 2 songs and append to answer.
        for i in range(0, len(a[0])) :
            if (i >= 2) :
                break
            answer.append(a[0][i][0])

        # remove current genre from list.
        a.pop(0)

    return answer
  • c++ 보다, python이 더 쉽게 코딩할 수 있을 듯 하여, python으로 구현했다.
  • 자세한 설명은 코드 주석으로 달아놓았다.
  • sort.(key=itemgetter(1)) 부분이 생소할 수 있는데, 나도 처음 써본다. sort 하고자 하는 list의 item의 1번째 인덱스 기준으로 sort 하는 방식이라고 한다. 자세한 설명은 점프 투 파이썬을 참조.