02/25 알고리즘 문제풀이 - 베스트앨범 (프로그래머스)

Data Architect / Engineer·2024년 2월 25일

1일_1알고리즘

목록 보기
2/21
post-thumbnail

문제

  • 프로그래머스 알고리즘 문제
  • 베스트앨범
  • 문제 내용 : [링크]


내가 작성한 코드

from collections import defaultdict
def solution(genres, plays):
    answer = []
    Ha = defaultdict(list)
    Hb = defaultdict(int)
    

    for i, (x, y) in enumerate(zip(genres, plays)):
        Ha[i].append(x)
        Ha[i].append(y)
        Hb[x] += y
    # Ha = {0: ['classic', 500], 1: ['pop', 600], 2: ['classic', 150], 3: ['classic', 800], 4: ['pop', 2500]}
    # Hb = {'classic': 1450, 'pop': 3100}
    
    
    s_gen = (sorted(Hb.items(), key = lambda x:-x[1]))
    s_de = (sorted(Ha.items(), key = lambda x: (-x[1][1], x[0])))
    # s_gen = [('pop', 3100), ('classic', 1450)]
    # s_de = [(4, ['pop', 2500]), (3, ['classic', 800]), (1, ['pop', 600]), (0, ['classic', 500]), (2, ['classic', 150])]
    
    
    for x in s_gen:
        cnt = 0
        for y in s_de:
            if y[1][0] == x[0]:            
                answer.append(y[0])
                cnt += 1
                if cnt == 2:
                    break
    return answer
    # 	[4, 1, 3, 0]
  • 각각 장르, 곡 별 정보의 데이터를 활용해야 하므로, 딕셔너리 형태로 데이터를 저장하고 접근

  • defaultdict 함수를 이용하여 Ha에는 곡 고유번호별 장르와 플레이 횟수를 리스트 형태의 Value로 저장하고, Hb에는 곡 장르별 총 플레이 횟수를 저장한다.

  • Hb의 플레이 횟수가 큰 순으로 내림차순 정렬한 tuple 값들을 모아놓은 리스트를 s_gen으로 만들어준다.

  • Ha의 플레이 횟수가 큰 순으로 내림차순, 같은 플레이 횟수를 가질 때 앞 번호의 고유번호가 오도록 고유번호별 오름차순 정렬해 tuple 값들을 모아놓은 리스트를 s_de로 만들어준다.

  • s_gen 총 플레이 횟수가 많은 곡 장르 순서대로, 각 곡의 플레이 횟수가 많은 곡 상위 2개의 고유번호를 answer에 append 해 준다. 장르별로 cnt 값을 설정하여, cnt = 2가 되면 더 이상 answer에 곡이 포함되지 않도록 한다.

  • 배울 내용이 많은 문제였다.
  1. {k:v}구조를 활용한 데이터 저장 (defaultdict 활용)
  2. for문 활용 시, 여러 리스트에서 element와 인덱스를 추출 하는 방법
  3. 여러 항목에 기준으로 리스트와 튜플을 정렬하는 방법
profile
질문은 계속돼 아오에

0개의 댓글