Skip to content

[Algorithm] 실패율 #23

@hwangJi-dev

Description

@hwangJi-dev

💬 문제

[코딩테스트 연습 - 실패율](https://school.programmers.co.kr/learn/courses/30/lessons/42889)


💬 Idea

  • 스테이지 개수만큼 stageDict를 초기화해준다.
  • stage에 머무른 사용자의 수를 stageDict에 기록한다.
  • stage의 개수보다 큰 stage에 머무른 사용자는 filter를 통해 제거하고, 실패율을 계산한다.
    • 이 때 총 사용자의 수에서 낮은 stage부터 실패한 사용자가 누적으로 제거되어 실패율이 계산된다.
    • 즉 stage3에서 계산되는 실패율의 기준 사용자는
      기준 사용자 = 총 사용자의 수 - stage1,2에서 머무른 사용자의 수 이다.
  • 이렇게 실패율을 구하고, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return한다.

💬 풀이

func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var stageDict: [Int: Int] = [:]

    for i in 1...N {
        stageDict[i] = 0
    }
    
    for i in stages {
        stageDict[i] = stageDict[i] != nil ? stageDict[i]! + 1 : 1
    }
    
    var stageCount = stages.count
    var failureDict: [Int: Double] = [:]
    
    for i in stageDict.keys.filter({ $0 <= N }).sorted() {
        failureDict[i] = Double(stageDict[i]!)/Double(stageCount)
        stageCount -= stageDict[i]!
    }
    
    var sortedDict = failureDict.sorted { $0.key < $1.key }
    sortedDict = sortedDict.sorted { $0.value > $1.value }
    
    return sortedDict.map { $0.key }
}

💬 알게된 문법

⭐️ 나누기 할 때 소수점 이하의 숫자가 필요한 경우

Double(num1)/Double(num2)

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions