안녕하세요 :)
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
}