동까의 코딩

[python] 프로그래머스 - 베스트 앨범 본문

문제 풀이/프로그래머스

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

동까의 코딩 2025. 3. 12. 11:51
반응형

베스트 앨범 문제 풀이 및 상세 설명

프로그래머스의 베스트 앨범 문제는 각 장르별로 재생 횟수를 기준으로 노래들을 정렬하고, 장르의 총 재생 횟수가 높은 순으로 두 곡씩 선택하여 베스트 앨범을 구성하는 문제입니다.

문제 해결 접근 방식

문제를 해결하기 위한 주요 단계는 다음과 같습니다:

  1. 장르별 분류:
    입력으로 주어진 genresplays 리스트를 이용하여, 각 장르에 해당하는 (재생 횟수, 인덱스) 튜플들을 저장합니다.

    • 예를 들어, "pop" 장르에 속하는 노래들의 재생 횟수와 해당 인덱스를 함께 저장합니다.
  2. 내부 정렬:
    각 장르별 리스트를 재생 횟수가 높은 순으로 정렬합니다.

    • 만약 재생 횟수가 같은 경우, 인덱스가 작은 순으로 정렬하여 우선순위를 결정합니다.
  3. 장르 정렬:
    전체 장르를 해당 장르에 속하는 노래들의 총 재생 횟수를 기준으로 내림차순 정렬합니다.

    • 이를 통해 가장 인기 있는 장르부터 베스트 앨범에 반영할 수 있습니다.
  4. 노래 선택:
    정렬된 각 장르별로 상위 2개의 노래(재생 횟수가 가장 높은 노래)를 선택하여 최종 결과 리스트에 추가합니다.

  5. 최종 결과 반환:
    선택된 노래들의 인덱스를 순서대로 반환하여 베스트 앨범을 구성합니다.

이러한 단계들을 통해 문제를 구조적으로 해결할 수 있으며, 각 단계마다 정렬과 선택 기준을 명확히 하여 올바른 결과를 도출할 수 있습니다.


코드 구현

아래는 위의 문제 해결 접근 방식을 반영한 파이썬 코드입니다. 각 단계별로 중요한 부분에 주석을 추가하여 설명합니다.

def solution(genres, plays):
    # answer: 최종적으로 베스트 앨범에 들어갈 곡의 인덱스들을 저장할 리스트
    answer = []

    # hash_map: 각 장르를 key로 하여 (재생 횟수, 인덱스) 튜플 리스트를 value로 저장
    hash_map = {}

    # 1. 장르별로 (재생 횟수, 인덱스) 튜플을 hash_map에 저장
    for i in range(len(genres)):
        if genres[i] in hash_map:
            hash_map[genres[i]].append((plays[i], i))
        else:
            hash_map[genres[i]] = [(plays[i], i)]

    # 2. 각 장르 내에서 재생 횟수가 많은 순으로 정렬
    #    - 재생 횟수가 동일하면 인덱스가 작은 순으로 정렬하여 우선순위를 결정
    for genre in hash_map:
        hash_map[genre].sort(key=lambda x: (-x[0], x[1]))

    # 3. 전체 장르를 해당 장르의 총 재생 횟수를 기준으로 내림차순 정렬
    sorted_hash_map = dict(sorted(hash_map.items(), key=lambda x: -sum(play[0] for play in x[1])))

    # 4. 각 장르별로 상위 2개의 곡(재생 횟수 기준) 인덱스를 answer에 추가
    for genre in sorted_hash_map:
        # 장르별로 최대 2개의 곡을 선택
        answer.extend([index for _, index in hash_map[genre][:2]])

    return answer
반응형