본문 바로가기
알고리즘이야기/프로그래머스_알고리즘_lv3

베스트앨범

by 효우너 2020. 5. 31.
728x90
반응형
문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��

programmers.co.kr


1차 실패

from collections import Counter
def solution(genres, plays):
    m=[]
    answer=[]
    d={}
    for i,name in enumerate(genres):
        answer.append([i,name,plays[i]])
    answer.sort(reverse=True, key=lambda x:x[2])
    answer.sort(reverse=True, key=lambda x:x[1])
    for i in range(len(genres)):
        if genres[i] in d:
            d[genres[i]]+=plays[i]
        else:
            d[genres[i]]=plays[i]
    di=sorted(d.items(),reverse=True, key=lambda x:x[1])
    for i in range(len(answer)):
        for j in range(len(di)):
            if di[j][0] in answer[i]:
                m.append(answer[i][0])
                if len(m)==2*(j+1):
                    break
    return m

2차 실패

def solution(genres, plays):
    m=[]
    answer=[]
    d={}
    for i,name in enumerate(genres):
        answer.append([i,name,plays[i]])
    answer.sort(reverse=True, key=lambda x:x[2])
    answer.sort(reverse=True, key=lambda x:x[1])
    for i in range(len(genres)):
        if genres[i] in d:
            d[genres[i]]+=plays[i]
        else:
            d[genres[i]]=plays[i]
    di=sorted(d.items(),reverse=True, key=lambda x:x[1])
    for i in range(len(di)):
        for j in range(len(answer)):
            if j>2:
                break
            elif di[i][0] in answer[j]:
                m.append(answer[j][0])
        answer.pop(0)
    return m

3차 실패

from collections import Counter
def solution(genres, plays):
    m=[]
    answer=[]
    d={}
    for i,name in enumerate(genres):
        answer.append([i,name,plays[i]])
    answer.sort(reverse=True, key=lambda x:x[2])
    answer.sort(reverse=True, key=lambda x:x[1])
    for i in range(len(genres)):
        if genres[i] in d:
            d[genres[i]]+=plays[i]
        else:
            d[genres[i]]=plays[i]
    di=sorted(d.items(),reverse=True, key=lambda x:x[1])
    for i in range(len(di)):
        j=0
        for _ in range(2):
            if di[i][0] in answer[j]:
                m.append(answer[j][0])
                del answer[j]
    return m

4차 성공

from operator import itemgetter
def solution(genres, plays):
    d={}
    answer=[]
    for i in range(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]
    a=list(d.values())
    a.sort(reverse=True, key=itemgetter(0))
    while a:
        a[0].pop(0)
        a[0].sort(reverse=True, key=itemgetter(1))
        for i in range(len(a[0])):
            if i>=2:
                break
            answer.append(a[0][i][0])
        a.pop(0)
    return answer

처음에 너무 복잡하게 list를 많이 만들고 2개 이상의 곡을 가지고 있는 장르를 감당하지 못해 에러가 난 것 같다..

다른 분의 풀이를 보고 도움을 받았는데 이렇게 간단하게 풀수있다니,,,,,,,,,,

그래도 덕분에 itemgetter 사용법도 알게 되었다..!

갠적으루 lambda보다 itemgetter가 훨씬 편해,,,,


 

 

itemgetter 사용하기

sort문제를 풀 때 key=lambda x:x[1] 이런식으로 풀었었는데 내 기준으로 이것보다 간단한 itemgetter 를 알게되었다. from operator import itemgetter를 써주면 사용할 수 있다. from operator import itemgette..

hyoveloper.tistory.com

 

728x90
반응형

댓글