프로그래머스 : 베스트 앨범(Swift)

프로그래머스 해쉬단계 마지막 문제. 이 문제에서 까먹기 쉬운것이 장르당 최대 2개까지만 추가 가능하다는 점이다. 이 점도 모르고 꽤 헤멨다. 또 이문제에서 헤멧던 것은 장르를 재생수 순서로 정렬을 하고 장르에 해당하는 인덱스 값을 가져오는것이었는데 처음에는 gernes로만 인덱스 값을 가져오려 했지만, 그 경우 노래 양이 많아지면 시간이 오래 걸려 다른 Dictionary를 만들어서 인덱스 값을 가져오게 하였다.

 

1. songList에 장르당 총 재생시간을 추가한다. 또 장르의 인덱스 값을 value로 가지는 idByValue를 만든다.

2. songList를 재생량 순으로 정렬.

3. songList에서 장르 순으로 인덱스 값을 가지고 있는 idByValue를 통해 plays를 재생 순으로 정렬해서 sortId에 넣는다.

4. answer에 sortId를 순서대로 추가한다. 단 추가 되는 노래의 개수는 2개가 최대라는 조건이 포함된다.

import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    var songList : [String : Int] = [:]
    var idByGenres : [String : [Int]] = [:]
    var answer : [Int] = []
    for item in 0..<genres.count {
        if songList.contains(where: { (key: String, value: Int) in
                            return key == genres[item]
                        }){
                            songList[genres[item]] = songList[genres[item]]!+plays[item]
                            idByGenres[genres[item]]!.append(item)
                        }else{
                            songList[genres[item]]=plays[item]
                            idByGenres[genres[item]] = [item]
                        }
    }
    
    var sortedSongList = songList.sorted{$0.1 > $1.1}

    for item in sortedSongList {
        var count = 0
        var sortId = idByGenres[item.key]!.sorted{
            return plays[$0] > plays[$1]
        }
        for item in sortId {
            if count == 2{
                break
            }else{
                answer.append(item)
                count += 1
            }
        }
    }
    return answer
}