관리 메뉴

솜씨좋은장씨

[Programmers] 해시 : 베스트앨범 (Python) 본문

Programming/코딩 1일 1문제

[Programmers] 해시 : 베스트앨범 (Python)

솜씨좋은장씨 2020. 2. 27. 13:31
728x90
반응형

1일 1문제 21일차!

오늘의 문제는 프로그래머스 베스트 앨범 입니다.

 

코딩테스트 연습 - 베스트앨범 | 프로그래머스

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 play

programmers.co.kr

첫번째 시도

dictionary를 활용해보기로 했습니다.

def solution(genres, plays):
    answer = []
    
    if len(genres) > 1:
        genres_dic = {genres[0]:[(plays[0], 0)]}
        
        total_plays_dic = {genres[0]:plays[0]}
        
        for i in range(1, len(genres)):
            if genres[i] not in genres_dic.keys():
                genres_dic[genres[i]] = [(plays[i], i)]
                total_plays_dic[genres[i]] = plays[i]
            else:
                genres_dic[genres[i]].append((plays[i], i))
                total_plays_dic[genres[i]] = total_plays_dic[genres[i]] + plays[i]
        
        
        
        sorted_play_dic = sorted(total_plays_dic, reverse=True)
        
        for key in sorted_play_dic:
            play_time_list = genres_dic[key]
            
            play_time_list = sorted(play_time_list, key=lambda x:(-x[0], x[1]))
            
            if len(play_time_list) >= 2:
                for i in range(2):
                    answer.append(play_time_list[i][1])
            else:
                for i in range(len(play_time_list)):
                    answer.append(play_time_list[i][1])       
    else:
        answer.append(0)
        
    
    return answer

 

두번째 시도

def solution(genres, plays):
    answer = []
    genres_dic = {}
    total_plays_dic = {}
    
    if len(genres) == 1:
        return [0]
    else:        
        for i in range(len(genres)):
            if genres[i] not in genres_dic.keys():
                genres_dic[genres[i]] = [(plays[i], i)]
                total_plays_dic[genres[i]] = plays[i]
            else:
                genres_dic[genres[i]].append((plays[i], i))
                total_plays_dic[genres[i]] = total_plays_dic[genres[i]] + plays[i]



        sorted_play_dic = sorted(total_plays_dic, reverse=True)

        for key in sorted_play_dic:
            play_time_list = genres_dic[key]


            if len(play_time_list) >= 2:
                play_time_list = sorted(play_time_list, key=lambda x:(-x[0], x[1]))
                for i in range(2):
                    answer.append(play_time_list[i][1])
            else:
                for i in range(len(play_time_list)):
                    answer.append(play_time_list[i][1])       
    return answer

 

세번째 시도

def solution(genres, plays):
    answer = []
    genres_dic = {}
    total_plays_dic = {}
    
    if len(genres) == 1:
        return [0]
    else:        
        for i in range(len(genres)):
            if genres[i] not in genres_dic.keys():
                genres_dic[genres[i]] = [(plays[i], i)]
                total_plays_dic[genres[i]] = plays[i]
            else:
                genres_dic[genres[i]].append((plays[i], i))
                total_plays_dic[genres[i]] = total_plays_dic[genres[i]] + plays[i]



        sorted_play_dic = sorted(total_plays_dic, reverse=True)

        for key in sorted_play_dic:
            play_time_list = genres_dic[key]


        
            play_time_list = sorted(play_time_list, key=lambda x:(-x[0], x[1]))
            if len(play_time_list) >= 2:
                for i in range(2):
                    answer.append(play_time_list[i][1])
            else:
                answer.append(play_time_list[i][1])
    return answer

 

네번째 시도

def solution(genres, plays):
    answer = []
    
    genre_total_play = {}
    genre_dic = {}
    
    for i in range(len(genres)):
        if genres[i] not in genre_dic.keys():
            genre_dic[genres[i]] = [(plays[i], i)]
            genre_total_play[genres[i]] = plays[i]
        else:
            genre_dic[genres[i]].append((plays[i], i))
            genre_total_play[genres[i]] = genre_total_play[genres[i]] + plays[i]
            
#     print(genre_total_play)
#     print(genre_dic)
    
    sorted_total_play = sorted(genre_total_play.items(), key=lambda x: x[1], reverse=True)
    print(sorted_total_play)
    
    for key in sorted_total_play:
        play_list = genre_dic[key[0]]
        
        play_list = sorted(play_list, key = lambda x : (-x[0], x[1]))
        
        
        for i in range(len(play_list)):
            if i == 2:
                break
            answer.append(play_list[i][1])
    
    return answer

문제는 정렬시에 items를 붙이지 않고 정렬했던 것이 문제였습니다.

두 번째 런타임 오류때 파악을 했어야했는데 그러지 못한게 아쉬웠던 문제입니다.

 

 

SOMJANG/CODINGTEST_PRACTICE

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

 

Comments