프로그래머스 - 베스트 앨범

이윤재·2020년 9월 2일
0

🏀 문제

https://programmers.co.kr/learn/courses/30/lessons/42579
문제는 따로 설명하지 않고, 링크를 첨부.

💡 접근 방식

결국 필요한 요소는 앨범에 장르 순서를 정할 장르별 총합과 해당 장르에서 플레이수가 많은 두 곡이다.

  • 공통
    공통적으로 필요한 idx 정보는 dict 형식으로 보관해서 계속 접근 가능하도록 사용.
  • 장르별 총합
    idx dict 기반으로 각 장르별 총합을 구하고, 이를 기반으로 sort 시켜서 장르 순서 정리
  • 곡 순서
    장르별 합 기준과 idx dict 기준으로 해당 장르에 속한 곡을 찾고, 따로 list를 만들어서 곡 별 순서를 정함.

고민한 요소,
dict를 key기준으로 sort를 어떻게 할 것인가? key:lambda x: x[1]

🔧 코드

from _collections import defaultdict

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

    idx_dict = defaultdict(lambda: [])
    for i in range(len(genres)):
        idx_dict[genres[i]] += [i]

    total_dict = defaultdict(int)
    for g, values in idx_dict.items():
        for val in values:
            total_dict[g] += plays[val]
    total_dict =  sorted(total_dict.items(), key=lambda x: x[1], reverse=True)
    for g, value in total_dict:
        temp = []
        for val in idx_dict[g]:
            temp.append([val,plays[val]])
        temp = sorted(temp,key=lambda x:x[1], reverse=True)
        for j in range(2):
            if len(temp) == 1:
                answer.append(temp[j][0])
                break
            answer.append(temp[j][0])
    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

차이 : idx가 아닌 [장르, 플레이수] 기준으로 dict를 만들었고,
합을 key= lambda x: sum( map(lambda y: y[0],d[x]))
d[x] -> 장르,플레이수 -> 플레이수 sum 을 해서 찾음.

profile
시작단계

0개의 댓글