Algorithm/1일 1코테

[🥲 프로그래머스] 베스트앨범 - hash

대인보우 2021. 7. 24. 16:06
반응형

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

 

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

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

programmers.co.kr

 

내가 시도한 풀이

# 84점으로 광탈ㅠ
def solution(genres, plays):
    music_list = {}
    idx = 0
    for g, p in zip(genres, plays): # 각 카테고리마다 [고유번호, 플레이횟수] 순으로 넣어준다.
        if g not in music_list:
            music_list[g] = []
            music_list[g].append([idx, p])
        else:
            music_list[g].append([idx, p])
        music_list[g].sort(key = lambda x:(x[1],x[0])) # 플레이횟수 -> 고유번호 순으로 정렬
        idx += 1
	# 각 카테고리별로 합계를 구해준다. 
    sum_list = {}
    for category in music_list:
        for music in music_list[category]:
            if category not in sum_list:
                sum_list[category] = music[1]
            else:
                sum_list[category] += music[1]
                
    answer = []
    # 가장 많이 플레이 된 카테고리 -> 카테고리에서 가장 많이 플레이된 노래 순으로 넣어준다.
    while sum_list:
        max_category = max(sum_list.keys(), key=lambda k : sum_list[k])
        for music in music_list[max_category][-1:-3:-1]:
            answer.append(music[0]) # 고유번호
        del(sum_list[max_category])
    return answer

 

✅ 다른사람 풀이

from collections import defaultdict

def solution(genres, plays):
    play_count_by_genre = defaultdict(int)
    songs_in_genre = defaultdict(list)
	
    for song_id, genre, play in zip(counter(), genres, plays):
        play_count_by_genre[genre] += play # 장르별 횟수
        songs_in_genre[genre].append((-play, song_id)) # 아이디와 노래 횟수
	
    genre_in_order = sorted(play_count_by_genre.keys(), key=lambda g:play_count_by_genre[g], reverse=True)
	
    answer = list()
    for genre in genre_in_order:
        answer.extend([ song_id for minus_play, song_id in sorted(songs_in_genre[genre])[:2]])
    return answer

# id 생성
def counter():
    i = 0
    while True:
        yield i
        i += 1

깔끔쓰...

저렇게 풀고 싶었는데 못품!!!!!!

반응형