1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3#
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

해당 문제를 풀때 주의해야할 점은 다음과 같다
1. 장르별 곡을 분류 해야함 -> dict 사용 (key: genres / value: plays)
2. 많이 재생된 순으로 정렬 -> 내림차순이므로 reverse=True
3. 장르내 플레이수가 같은 경우 더 낮은 고유번호가 먼저 오도록 설정 -> 이미 식별된 경우 마킹이 필요함
2. 알고리즘
1) 장르별 곡 플레이 수를 dict에 저장한다
2) dict 에 저장할때 플레이수는 내림차순으로 저장한다
3) dict는 장르를 key로 플레이수를 value로 list 타입에 갖고있으므로, value의 합들의 내림차순으로 정렬한다 -> 바로 조회하기 위함
4) 정렬한 dict는 list 상태에서 조회하고, 장르당 항상 2곡이 아니라 1곡만 있는 경우를 대비하여 반복한다
5) 기존 plays에서 해당 플레이수 index를 찾아내고 해당 장르가 맞는지 확인하여 index를 answer에 저장한다
6) 같은 장르에 플레이수가 동일한 경우 더 작은 index를 가지고 있는 노래가 먼저 선정되므로, 찾아진 노래는 -1로 list 값을 바꿔둔다
3. 코드
def solution(genres, plays):
album = {}
win = []
answer = []
# 장르별로 곡들을 분류 하여 dict 처리하되, 재생수 기준 내림차순
for song, cnt in zip(genres, plays):
if song not in album:
album[song] = [cnt]
else:
album[song].append(cnt)
album[song].sort(reverse=True)
# 전체 재생 횟수 기준 내림차순으로 dict 정렬 -> list 변환
ordered = (sorted(album.items(), key=lambda x: sum(x[1]), reverse=True))
for k, v in ordered:
# 장르당 노래가 1곡인 경우
move = min(len(v), 2)
for i in v [0:move]:
# 현재 플레이된 노래 인덱스 찾기
pos = plays.index(i)
if (pos != -1) & (genres[pos] == k): #노래가 찾아졌고 해당 노래 장르를 확인후
plays[pos] = -1 #앨범에 포함된 경우 더 이상 집계 되지 않도록 -1 처리
answer.append(pos) #노래를 앨범에 저장
return answer'Algorithm' 카테고리의 다른 글
| [프로그래머스] 소수 찾기 (1) | 2026.01.07 |
|---|---|
| [프로그래머스] 타겟 넘버 (0) | 2026.01.06 |
| [백준 2146] 다리 만들기 (0) | 2024.09.17 |
| [백준 1987] 알파벳 (0) | 2024.09.17 |
| [백준 1922] 네트워크 연결 (0) | 2024.09.17 |