문제에서 시키는 그대로 구현하면 되는 문제입니다.
1번 조건인 “속한 노래가 많이 재생된 장르를 먼저 수록합니다.”를 구현하기 위해서 Dictionary를 사용해야 합니다. 장르의 이름은 String으로 제시되어 있고 재생 횟수는 Int이므로 [String : Int]를 사용하면 됩니다.
나머지 과정은 코드를 보면서 소개해드리도록 하겠습니다.
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
// 장르별 플레이 횟수 세기
func countPlaysPerGenres() -> [String : Int] {
var result = [String : Int]()
// 고유번호 i의 장르를 key에 고유번호 i의 재생횟수를 더한다.
for i in 0..<genres.count {
result[genres[i], default: 0] += plays[i]
//👉 dictionary의 default가 이런 상황에 아주 유용!
}
return result
}
// 장르별 플레이 횟수
let playsPerGenre = countPlaysPerGenres()
// 결과를 저장할 배열
var result = [Int]()
// 장르의 key를 플레이 횟수의 내림차순으로 정렬해서 순회한다.
//👉 조건 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
for genre in playsPerGenre.keys.sorted(by: { playsPerGenre[$0]! > playsPerGenre[$1]! }) {
var interim = [Int]()
// 해당 장르에 속하는 노래의 고유번호(i)를 임시 배열에 저장
for i in 0..<plays.count {
if genres[i] == genre { interim.append(i) }
}
// 고유 번호들의 배열을 재생이 많은 순으로 정렬
//👉 조건 2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
//👉 조건 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. (이 배열은 이미 고유번호 순으로 정렬되어 있으므로 별도의 정렬 필요 없음)
interim.sort(by: { plays[$0] > plays[$1] })
// 만약에 해당 장르의 곡이 1개라면 1개만 노래에 담아야 함.
let numOfSong = interim.count > 1 ? 2 : 1
// 결과 배열에 상위 2곡만 담는다.
result.append(contentsOf: interim[0..<numOfSong])
}
return result
}