[Swift] 프로그래머스(Lv3) - 베스트앨범

Kerri·2021년 5월 26일
0

코테

목록 보기
52/67

안녕하세요 :)

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

풀이

Swift의 Dictionary정렬을 이용하여 풀었습니다.

1) 먼저 genre를 key로 [idx, plays[idx]]를 value로 가지는 딕셔너리를 만듭니다.

["classic": [[0, 500], [2, 150], [3, 800]], "pop": [[1, 600], [4, 2500]]]

2) genre별 plays[idx]의 합을 구하여 내림차순 정렬합니다.

let sortedDict = dict.sorted { (first, second) -> Bool in
        return first.value.map { $0[1] }.reduce(0, +) > second.value.map { $0[1] }.reduce(0, +)
    }

여기서, map으로 value의 plays[idx]를 가져온다음 합을 구합니다. 합을 구하는 함수는 array.reduce(0, +)을 이용하면 됩니다.

3) value를 plays[idx] 기준으로 내림차순 정렬합니다. 만약 play값이 같다면 인덱스가 작은 값이 먼저 나오도록 합니다.

let item = sortedDict[idx].value.sorted { (first, second) -> Bool in
            return first[1] == second[1] ? false : first[1] > second[1]
        }
import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    var answer: [Int] = []
    var dict: [String: [[Int]]] = [:]
    
    for idx in 0..<genres.count {
        if let _ = dict[genres[idx]] {
            dict[genres[idx]]?.append([idx, plays[idx]])
        } else {
            dict[genres[idx]] = [[idx, plays[idx]]]
        }
    }

    let sortedDict = dict.sorted { (first, second) -> Bool in
        return first.value.map { $0[1] }.reduce(0, +) > second.value.map { $0[1] }.reduce(0, +)
    }
    
    for idx in 0..<sortedDict.count {
        let item = sortedDict[idx].value.sorted { (first, second) -> Bool in
            return first[1] == second[1] ? false : first[1] > second[1]
        }
        for idx in 0..<item.count {
            if idx > 1 {
                break
            }
            
            answer.append(item[idx][0])
        }
    }
    return answer
}
profile
안녕하세요 !

0개의 댓글