알고리즘 문제풀이

프로그래머스 베스트앨범 파이썬

dolchimdae 2022. 4. 9. 17:23
반응형

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

 

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

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

programmers.co.kr

<소스 코드>

def solution(genres, plays):
    answer = []
    n = len(genres)
    d = {}
    # 각 장르별 총 재생횟수 구해 정렬
    for i in range(n):
        if genres[i] in d:
            d[genres[i]] += plays[i]
        else:
            d[genres[i]] = plays[i]
    d1 = sorted(d.items(), key=lambda x: x[1], reverse = True)
    
    for d in d1: # 총 재생횟수가 큰 장르부터
        data = []
        for i in range(n): # 해당 장르의 plays 와  index 튜플 배열 모아
            if genres[i] == d[0]:
                data.append((plays[i],i))
        # 정렬하는데 1순위를 재생횟수 내림차순, 2순위 고유번호 오름차순       
        d2 = sorted(data, key = lambda x : (-x[0],x[1]))
        # 정렬된 해당 장르에 대한 배열을 answer 에 덧붙인다
        if len(d2) == 1: # 속한 곳이 하나인 경우 고려
            answer.append(d2[0][1])
        else:   
            answer.append(d2[0][1])
            answer.append(d2[1][1])
    
    return answer

 

<풀이>

1. 사전 자료형을 통해 각 genre 별 plays 를 구해 정렬한다.

2. 정렬된 각 genre 에 대해, genres 배열을 돌며 같은 genre 면 해당되는 (play, index) 을 data 에 추가한다.

3. (play,index) 배열인 data 를 재생횟수 내림차순, 고유번호 오름차순 우선순위로 정렬한다.

4. 위 배열에서 곡 수가 하나면 하나, 아니면 앞에서 두 곡을 answer 배열에 덧붙인다.

5. 다음으로 큰 genre 에 대해 2~4 를 반복한다.

반응형