히비스서커스의 블로그

[Programmers] 베스트앨범 본문

Theory/Algorithm

[Programmers] 베스트앨범

HibisCircus 2021. 9. 3. 20:14
728x90

프로그래머스 코딩테스트 문제 중 해시를 이용해야하는 문제 베스트앨범에 대해 파이썬으로 해결한 풀이와 해설입니다.

 

문제링크

 

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

 

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

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

programmers.co.kr

 

solution

 

def solution(genres, plays):
    hash = dict()

    for i in range(len(genres)):
        if genres[i] in hash:
            hash[genres[i]].append([i, plays[i]])
        else:
            hash[genres[i]] = [[i, plays[i]]]

    song = sorted(hash.values(), key = lambda x : -sum([j[1] for j in x]))

    answer = []
    for genre in song:
        answer.append(max(genre, key = lambda x: x[1])[0])
        genre.remove(max(genre, key = lambda x: x[1]))
        try:
            answer.append(max(genre, key = lambda x: x[1])[0])
        except:
            pass
        
    return answer

 

해설

 

저는 크게 2파트로 나누어 해결하였습니다. 먼저, 속한 노래가 많이 재생된 장르 순으로 정리된 해시를 만드는 과정과 장르 내에서 많이 재생된 2곡의 고유번호를 넣는 과정입니다.

 

속한 노래가 많이 재생된 순으로 정리된 해시를 만드는 과정

1. hash라는 딕셔너리를 만듭니다.

2. for 문을 돌면서 key값은 genre이며 value값은 첫번째 원소가 고유번호, 두번째 원소가 재생횟수인 리스트를 넣어주고 겹칠 시에 append하여줍니다.

3. hash를 속한 노래가 많이 재생된 순으로 정렬된 리스트인 song을 만들기 위해 sorted를 쓰되, lambda를 이용하여 hash.values()의 두번째 원소인 재생횟수를 토대로 합니다.

 

장르 내에서 많이 재생된 2곡의 고유번호를 넣는 과정

1. answer라는 빈 리스트를 만든 후 song 안에서 for문을 돌립니다.

2. genre내에서 재생횟수가 가장 큰 리스트의 고유번호를 뽑아 answer에 추가하고 genre에서는 지워줍니다.

3. 만약 genre내에 한 곡 밖에 없을 시 오류가 나는 것을 방지하기 위해 try & except문을 활용하여 위와 같은 방법을 한 번 더 진행해줍니다.

 

 

 

-히비스서커스- 

728x90

'Theory > Algorithm' 카테고리의 다른 글

[Programmers] 위장  (0) 2021.09.02
[Algorithm] 해시법  (0) 2021.08.26
[Programmers] 기능개발  (0) 2021.08.21
[Programmers] 더 맵게  (2) 2021.08.20
[Algorithm] 선형검색 이진검색  (0) 2021.02.04