본문 바로가기

코딩테스트

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

난이도 : Lv 2

분류 : 해시

 

문제

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드

 
import Foundation

func solution(_ genres: [String], _ plays: [Int]) -> [Int] {
    var playCountByGenre = [String: Int]()
    // 각 장르별로 총 재생 횟수를 저장하는 딕셔너리
    
    var songPlayCountByGenre = [String: [(id: Int, playCount: Int)]]()
    // 각 장르별로 노래의 고유 번호와 재생 횟수를 저장하는 배열
        
    for i in 0..<genres.count {
        let genre = genres[i]
        let playCount = plays[i]
        
        playCountByGenre[genre, default: 0] += playCount
        // 재생 횟수를 장르별로 누적

        songPlayCountByGenre[genre, default: []].append((id: i, playCount: playCount))
        // 해당 장르에 노래 정보를 추가
    }
    
    let sortedGenres = playCountByGenre.keys.sorted { playCountByGenre[$0]! > playCountByGenre[$1]! }
    // 총 재생 횟수가 많은 장르부터 정렬된 배열
    
    
    return sortedGenres.flatMap { genre in
        songPlayCountByGenre[genre]!.sorted(by: { $0.playCount == $1.playCount ? $0.id < $1.id : $0.playCount > $1.playCount }).prefix(2).map { $0.id }
    // 각 장르에서 노래를 재생 횟수로 내림차순 정렬하고, 최대 2곡까지 선택하여 반환
    }
    
}

 

풀이

1. Dictionary 를 사용해서 장르별 총 재생 횟수와 노래의 재생 횟수를 저장한다.

2. 장르별 총 재생 횟수가 많은 순서로 정렬된 목록을 만든다.

3. flatMap 을 사용해서 목록을 배열로 변환하고, 해당 장르의 노래 목록을 재생 횟수 내림차순으로 정렬한 뒤 2곡을 선택해서 반환한다.

4. sorted 함수에서는 재생 횟수가 같을 경우 ID 를 비교해서 오름차순으로 정렬한다.

 

P.S

처음 풀 때 for 문을 남발해서 시간초과가 났고, 생각을 다르게 해서 간결하게 해결했던 문제이다.