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'IT > 알고리즘' 카테고리의 다른 글
| [백준 Python] 1446번 지름길 (0) | 2025.10.17 |
|---|---|
| [알고리즘] 위상정렬 (0) | 2025.10.16 |
| [프로그래머스 Python] 호텔 대실 (0) | 2025.02.23 |
| [백준 Python] 2696번 중앙값 구하기 (0) | 2025.02.23 |
| [백준 Python] 1717번 집합의 표현 (0) | 2025.02.21 |