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



1. 문제

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

2. 풀이 방법

  • hash를 이용하여 노래 장르를 key로 하고 value는 (노래의 인덱스, 재생 횟수)를 인자로 가지는 배열을 가집니다.
  • 위의 요소들의 총 재생시간을 더하여 어떤 노래 장르가 먼저 나올지 결정합니다.
  • 각 key의 배열을 정렬합니다. 정렬할 때 재생회수가 같은 경우에는 적은 인덱스를 가진 요소를 앞으로 가져옵니다. 이 때, 2개의 노래만 최종 노래로 지정할 것이기 때문에 2개만 남기고 제거합니다.
  • 장르의 순서를 지정하였으면 장르 이름을 이용하여 hash에서 가지고 있는 배열을 출력합니다.

3. 시행착오

  • 장르 순서를 지정할 때, 2개의 최종 노래의 값이 아니라 전체 노래의 값을 기준으로 순서를 지정합니다.

4. 소스코드

4.1. python 정답 코드

def solution(genres, plays):
    dic = {}
    answer = []
    dic_sort_arr = []
    for i in range(len(genres)):
        if genres[i] in dic:
            dic[genres[i]].append((i, plays[i]))
        else:
            dic[genres[i]] = [(i, plays[i])]

    for key, val in dic.items():
        dic[key].sort(key=lambda element: (-element[1], element[0]))
        _min = min(len(dic[key]), 2)
        song_arr = []
        play_time = 0
        for i in range(len(dic[key])):
            play_time += dic[key][i][1]
        for i in range(_min):
            song_arr.append(dic[key][i])
        dic[key] = song_arr
        dic_sort_arr.append((play_time, key))

    dic_sort_arr.sort(key=lambda element: -element[0])

    for x in dic_sort_arr:
        for i in range(len(dic[x[1]])):
            answer.append(dic[x[1]][i][0])

    return answer

4.2. python 짧은 소스 코드

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