IT/알고리즘

[프로그래머스 Python] 베스트앨범

와잉 2026. 3. 19. 16:16

Level 3

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이 과정

1. 많이 재생된 장르를 구하기 위해 gen 생성

2. 장르에 따라 분류하기 위해 per_gen 생성

3. 많이 재생된 장르 먼저 수록하기 위해 gen 내림차순 정렬

4. 문제의 2번, 3번 조건을 만족하도록 (-x[1], x[0])로 정렬

5. 장르별 최대 2개씩 고유번호를 넣어줌

최적화 전 코드(내 풀이)

from collections import defaultdict
def solution(genres, plays):
    answer = []
    gen = defaultdict(int)  # 1)
    per_gen = defaultdict(list) # 2)
    
    for i in range(len(plays)):
        gen[genres[i]] += plays[i]
        per_gen[genres[i]].append((i, plays[i]))
        
    gen = sorted(gen.items(), key=lambda x: -x[1])  # 3)
    
    for genre in per_gen:
        per_gen[genre].sort(key=lambda x: (-x[1], x[0]))  # 4)
        
    for g in gen:
        twice = 0
        n = len(per_gen[g[0]])
        while twice<2 and twice<n:   # 5)
            answer.append(per_gen[g[0]][twice][0])
            twice += 1  
    return answer

최적화 후 코드(GPT)

from collections import defaultdict

def solution(genres, plays):
    answer = []
    gen = defaultdict(int)
    per_gen = defaultdict(list)

    for i, (genre, play) in enumerate(zip(genres, plays)):
        gen[genre] += play
        per_gen[genre].append((i, play))

    gen = sorted(gen.items(), key=lambda x: -x[1])

    for genre in per_gen:
        per_gen[genre].sort(key=lambda x: (-x[1], x[0]))

    for genre, _ in gen:  #구조분해
        for idx, _ in per_gen[genre][:2]: #슬라이싱 활용
            answer.append(idx)

    return answer

 

파이썬의 zip, enumerate 기능을 잘 활용해보자!

 

## zip

같은 인덱스끼리 묶으면서, 더 짧은 쪽 기준으로 잘림

genres = ["classic", "pop"]
plays = [500, 600]

zip(genres, plays)

#("classic", 500)
#("pop", 600)

 ## enumerate

인덱스 + 값,  in range(len())  대체용

arr = ["a", "b", "c"]

for i, v in enumerate(arr):
    print(i, v)
    
# 0 a
# 1 b
# 2 c