[Algorithm] 프로그래머스 실패율

Updated:

문제 설명

30

나의 풀이

import Foundation
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var dic = [Int: Int]()
    for i in 1...N+1 {
        dic[i] = 0
    }
    
    for count in stages {
        dic[count]! += 1
    }
    
    var failures = [Int: Double]()
    var count = stages.count
    
    for i in 1...N {
        if dic[i]! > 0 {
            failures[i] = Double(dic[i]!) / Double(count)
            count -= dic[i]!
        }
        if dic[i] == 0 {
            failures[i] = 0.0
        }
    }
    
    let answers = failures.sorted { (first, second) -> Bool in
        if first.value > second.value {
            return true
        }
        else if first.value == second.value {
            if first.key < second.key {
                return true
            }
        }
        return false
    }

    return answers.map {( $0.key )}
}

정렬을 할 때 sorted 내부에서 1개 이상의 조건을 가지고 정렬을 진행할 수 있다.

괜찮은 남의 풀이

import Foundation
func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var failure: [Int: Float] = [:]
    var player: Int = stages.count

    for i in 1...N {
        let n = stages.filter { $0 == i }.count
        failure[i] = Float(n)/Float(player)
        player -= n
    }

    return failure.sorted(by: <).sorted(by: { $0.value > $1.value }).map {$0.key}
}

앞부분의 failure을 구하는 부분이 훨씬 간단하게 구했다.

참고

Programmers

Leave a comment