본문 바로가기

알고리즘 문제

프로그래머스 베스트 앨범

실패 여러 테스트 케이스에서 런타임 에러가 남

from operator import itemgetter


def solution(genres, plays):
    album_list = []
    for i in range(len(genres)):
        album_list.append({
            'genres': genres[i], 'play_value': plays[i], 'play_index': i
        })
    album_list = sorted(album_list, key=itemgetter('play_value'), reverse=True)

    genre_dict = {}
    for album in album_list:
        if album['genres'] not in genre_dict:
            genre_dict[album['genres']] = {'value': album['play_value']}
            genre_dict[album['genres']]['index'] = [album['play_index']]
        else:
            genre_dict[album['genres']]['value'] += album['play_value']
            if len(genre_dict[album['genres']]['index']) < 2:
                genre_dict[album['genres']]['index'].append(album['play_index'])
    genre_list = []
    for genre in genre_dict:
        genre_list.append(genre_dict[genre])
    genre_list = sorted(genre_list, key=itemgetter('value'), reverse=True)
    list = []
    for i in genre_list:
        list.append(i['index'][0])
        list.append(i['index'][1])
    return list

실패 또 다른 런타임 에러...

from operator import itemgetter


def solution(genres, plays):
    album_dict = {}
    genre_sum = {}
    for i in range(len(genres)):
        if genres[i] not in album_dict:
            album_dict[genres[i]] = [{'music': [plays[i], i]}]
            genre_sum[genres[i]] = plays[i]
        else:
            album_dict[genres[i]].append({'music': [plays[i], i]})
            genre_sum[genres[i]] += plays[i]
    genre_sum = sorted(genre_sum, key=genre_sum.get, reverse=True)
    result = []
    for j in genre_sum:
        album_dict[j] = sorted(album_dict[j], key=itemgetter('music'), reverse=True)
    for k in genre_sum:
        result.append(album_dict[k][0]['music'][1])
        result.append(album_dict[k][1]['music'][1])
    return result

성공

key를 장르명, value를 index로 갖는 album_dict를 만들고 특정 장르의 총 재생 횟수를 누적하는 genre_sum을 만든다.

genre_sum의 item들을 총 재생횟수라는 value를 기준으로 정렬한다.

반환값은 list of tuple 형태로 genre_sum에 저장된다.

result에는 결과 값을 저장한다.

genre_sum에 있는 순서가 재생이 많이 된 장르 순이므로 for문을 돌린다.

album_dict에서 list of dict 형태의 특정 장르를 지정하고 정렬한다. 특정 장르에서 많이 재생 된 노래를 뽑아야 하므로 play라는 key의 값을 기준으로 내림차순, 같은 장르에서 재생 횟수가 같은 경우 index가 낮은 게 우선 순위가 높으므로 오름차순 정렬을 해준다.

특정 장르의 길이가 2 이상인 경우 두번째로 재생 횟수가 많은 노래의 index를 result에 추가한다.

from operator import itemgetter


def solution(genres, plays):
    album_dict = {}
    genre_sum = {}
    for i in range(len(genres)):
        if genres[i] not in album_dict:
            album_dict[genres[i]] = [{'play': plays[i], 'i': i}]
            genre_sum[genres[i]] = plays[i]
        else:
            album_dict[genres[i]].append({'play': plays[i], 'i': i})
            genre_sum[genres[i]] += plays[i]
    genre_sum = sorted(genre_sum.items(), key=itemgetter(1), reverse=True)
    result = []
    for i in genre_sum:
        album_dict[i[0]] = sorted(album_dict[i[0]], key=lambda e: (-e['play'], e['i']))
        result.append(album_dict[i[0]][0]['i'])
        if len(album_dict[i[0]]) >= 2:
            result.append(album_dict[i[0]][1]['i'])
    return result

두 가지 key를 가지고 동시에 dict 정렬을 하는 방법을 몰라서 헤맸다.