본문 바로가기
Algorithm/Programmers

[Algorithm/Programmers] 베스트앨범 Swift

by thoonk: 2021. 1. 29.
반응형

베스트앨범 Level3 Hash

 

문제 풀이:

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. -> 장르별로 총 재생 횟수 계산하여 내림차순으로 정렬
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. -> 재생 횟수 내림차순으로 정렬
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. -> 재생횟수가 같다면 인덱스 오름차순으로 정렬

 

0 1 2 3 4
classic pop classic classic pop
500 600 150 800 2500

 

장르에 대한 데이터(장르별 총 재생횟수: total, 고유 번호별 재싱 횟수: (index,play))를 딕셔너리로 생성한다.

스위프트의 딕셔너리는 할당 또는 value 업데이트로밖에 추가하는 방법이 없다. 그래서 장르는 같지만 고유 번호가 다른 항목을 넣기 위해서 고유 번호별 재생 횟수를 배열로 만들었다. 

 

그리고 장르 데이터를 기반으로 문제에서 주어진 위 번호 순서대로 정렬을 하면 답을 얻을 수 있다.

 

코드:

import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    
    var genreData = [String:(total: Int, data: [(index: Int, play: Int)])]()
    var result = [Int]()
    
    for (i, v) in genres.enumerated() {
    	// genreData의 키 값 유뮤를 통해 새로운 재생 횟수 추가 및 총 재생횟수 시간 갱신
        if !genreData.keys.contains(v) {
            genreData[v] = (plays[i], [(i, plays[i])])
        } else {
            let total = genreData[v]!.total + plays[i]
            var data = genreData[v]!.data
            data.append((i, plays[i]))
            genreData[v] = (total, data)
        }
    }
    // 장르별로 총 재생 횟수 계산하여 내림차순으로 정렬
    let sortedGenreData = genreData.sorted { $0.value.total > $1.value.total }
    
    sortedGenreData.forEach {
    	// 재생 횟수 내림차순으로 정렬, 재생횟수가 같다면 인덱스 오름차순으로 정렬
        let sortedData = $0.value.data.sorted { $0.play == $1.play ? $0.index < $1.index : $0.play > $1.play }
        
        // 한 장르마다 베스트 앨범에 들어가는 수는 최대 2개
        let cnt = sortedData.count > 1 ? 2 : 1
        for i in 0..<cnt {
            result.append(sortedData[i].index)
        }
    }
    return result
}

print(solution(["classic", "pop", "classic", "classic", "pop"], [500, 600, 150, 800, 2500]))
// [4, 1, 3, 0]

문제: 

programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

반응형

댓글