제주 탈출 일지

[python3] 프로그래머스 레벨 3 - 베스트앨범 본문

코딩 테스트

[python3] 프로그래머스 레벨 3 - 베스트앨범

귀건 2021. 6. 14. 21:15
728x90
반응형

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

 

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

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

programmers.co.kr

 

프로그램 코드

 

# 20점 

def solution(genres, plays):
    answer = []
    
    song_dic = dict()
    for i in range(len(genres)):
        song_dic[genres[i]] = {}
        
    for i in range(len(genres)):
        song_dic[genres[i]].setdefault(i, plays[i])
    s_song_dic = {}   
    # 많이 재생한 노래, 노래 고유번호 별 정렬
    for i in song_dic:
        s_song_dic[i] = sorted(song_dic[i].items(), key = lambda x : (-x[1],x[0]))
    
    sum_genres = {}
    
    # 문제 발생 지점
    for i in genres:
        tmp = 0
        for j in range(len(s_song_dic[i])):
            tmp += int(s_song_dic[i][j][1])
        sum_genres.setdefault(i,tmp)    
     
    
    s_sum_genres = sorted(sum_genres, key = lambda x : x[1], reverse = True)

    for i in s_sum_genres:
        for j in range(0, 2):
            try : answer.append(s_song_dic[i][j][0])
            except : continue
    
    return answer

 

가장 많이 재생된 장르를 더하는 과정에서 문제를 발견했다.

sum_genres를 처음부터 계산해서 딕셔너리로 만들고, 그 후 sorted 함수를 통해서 정렬.

그 정렬한 순서대로 장르별 많이 재생된 2개의 음악을 넣는데, 2개가 없다면 continue를 통해 다음 장르로 넘어가게 한다.

 

# 최종 답안

def solution(genres, plays):
    answer = []
    sum_genres = {} 
    
    song_dic = dict()
    for i in range(len(genres)):
        song_dic[genres[i]] = {}
        sum_genres.setdefault(genres[i], 0)
        
    for i in range(len(genres)):
        song_dic[genres[i]].setdefault(i, plays[i])
        sum_genres[genres[i]] += plays[i]
    s_song_dic = {}   
    # 많이 재생한 노래, 노래 고유번호 별 정렬
    for i in song_dic:
        s_song_dic[i] = sorted(song_dic[i].items(), key = lambda x : (-x[1],x[0]))
        
    s_sum_genres = dict(sorted(sum_genres.items(), key = lambda x : x[1], reverse = True))

    for i in s_sum_genres.keys():
        for j in range(0, 2):
            try : answer.append(s_song_dic[i][j][0])
            except : continue
    
    return answer

 

이 문제를 풀면서 해맸던 점은 장르 내의 정렬 기준이 2가지라는 점이다.

장르 별 재생건수가 가장 많은 순서대로, 그리고 같은 재생건수의 경우 고유번호가 작은 순으로 정렬해야 하기 떄문에 그 점을 고심하여 코드를 작성하였다.

 

다른 사람의 풀이

1. 중복이 필요없는 특정 종류를 얻을 때는 set을 사용하자.

2. zip 함수를 사용해서 한번에 깔끔하게 연관 데이터를 관리하자.

3. lambda 함수를 좀 더 고급지게 사용할떄는 map함수를 이용해서 이중으로 사용해보자.

728x90
반응형
Comments