https://programmers.co.kr/learn/courses/30/lessons/42889
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
var count = stages.count
//1) 도달한 스테이지의 배열이 담긴 stages를 Dictionary [도달한 스테이지: 사용자 수 ] 형태로 변경후 오름차순 정렬을 해준다.
let stagesCountDictionary = stages.reduce(into: [:]) { $0[$1, default: 0] += 1 }.sorted { $0.key < $1.key }
var failureToAcquisitionRateDictionary = [Int: Double]()
for (i,v) in stagesCountDictionary {
if i <= N { // 2) N(마지막 스테이지)값과 i(Dictionary의 key)값이 같거나 작다면 실패율을 구해준다. N(마지막 스테이지)을 넘어간 스테이지 실패율은 구해줄필요가 없다.
let failureToAcquisitionRate = Double(v) / Double(count)
failureToAcquisitionRateDictionary.updateValue(failureToAcquisitionRate, forKey: i)
}
count -= v // 지금 스테이지까지만 있는 사용자수를 빼준다.
}
for i in 1...N {
if !failureToAcquisitionRateDictionary.keys.contains(i) { // stages배열에 i가 나타나지 않았다면 그곳은 실패율이 0인곳이다.
failureToAcquisitionRateDictionary.updateValue(0, forKey: i)
}
}
let result = failureToAcquisitionRateDictionary
.sorted {
if $0.value == $1.value {
return $0.key < $1.key // key값을 기준으로 정렬
} else {
return $0.value > $1.value } // value값을 기준으로 정렬
}
.map { $0.key }
return result
}