[알고리즘] 프로그래머스 - 베스트앨범

Evan·2025년 4월 8일

알고리즘

목록 보기
7/10

베스트앨범


문제 설명

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 모아 베스트 앨범을 출시하려고 한다.
조건은 다음과 같다:
1. 속한 노래가 많이 재생된 장르를 먼저 수록
2. 장르 내에서 많이 재생된 노래를 먼저 수록
3. 재생 수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록
4. 각 장르에는 최대 2곡만 수록

예를 들어,
genres = ["classic", "pop", "classic", "classic", "pop"],
plays = [500, 600, 150, 800, 2500]
이면, pop이 먼저 오고, 그 다음 classic 순으로, 결과는 [4, 1, 3, 0]


제한 사항

  • genres[i]: 고유번호가 i인 노래의 장르
  • plays[i]: 고유번호가 i인 노래가 재생된 횟수
  • genresplays 길이는 1 이상 10,000 이하이며, 길이는 항상 같음
  • 장르 종류는 100종류 이하
  • 장르에 속한 곡이 하나라면, 하나만 선택



내가 접근한 방법


  1. 장르별로 곡 정보를 묶어 저장
    genrePlay 딕셔너리에 장르를 키로, (index, plays)를 값으로 저장

  2. 장르 내 곡 정렬
    같은 장르 내에서는 재생 수 기준 내림차순으로, 같으면 index 오름차순으로 정렬

  3. 장르별 총 재생 수로 정렬
    장르 전체의 재생 수 합을 구한 후, 많이 재생된 장르 순으로 정렬

  4. 장르마다 최대 2곡을 선택
    각 장르에서 상위 2곡만 결과 배열에 추가

import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    // 1. 장르별 곡 정보 저장
    var genrePlay: [String: [(index: Int, plays: Int)]] = [:]

    for (index, genre) in genres.enumerated() {
        genrePlay[genre, default: []].append((index, plays[index]))
    }

    // 2. 장르 내 곡 정렬
    for (genre, songs) in genrePlay {
        genrePlay[genre] = songs.sorted {
            if $0.plays != $1.plays {
                return $0.plays > $1.plays
            } else {
                return $0.index < $1.index
            }
        }
    }
    
    // 3. 장르별 총 재생 수 기준 정렬
    let genrePlayCount = genrePlay
        .mapValues { $0.reduce(0) { $0 + $1.plays } }
        .sorted { $0.value > $1.value }

    // 4. 각 장르별 최대 2곡 수록
    var result: [Int] = []
    for genre in genrePlayCount {
        if let songs = genrePlay[genre.key] {
            for song in songs.prefix(2) {
                result.append(song.index)
            }
        }
    }
    
    return result
}

profile
iOS 개발자

0개의 댓글