[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 실패율 (프로그래머스 lv1, 스위프트)

inu 2022. 2. 9. 02:06
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr


풀이 1

func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var numOfPlayer = stages.count
    var rate = [Int:Float]()
    let dic = stages.reduce(into: [Int:Int]()) { $0[$1, default: 0] += 1 }

    for n in 1...N {
        rate[n] = Float(dic[n] ?? 0) / Float(numOfPlayer)
        numOfPlayer -= dic[n] ?? 0
    }

    return rate.sorted(by: <).sorted { $0.value > $1.value }.map { $0.key }
}
  • tip: reduce(into::): into 값을 inout으로 받아서 result를 mutable하게 관리할 수 있다. (reduce의 결과로 Array나 Dictionary를 만들고싶을 때 유용하다.)
  • tip: default를 통해 dictionary에 기본값을 줄 수 있다.
  • dictionary를 기반으로 구현했기 때문에 마지막에 정렬을 두 번 필요로한다.

  • 모든 테스트케이스를 통과했다.

풀이 2

func solution(_ N:Int, _ stages:[Int]) -> [Int] {
    var numOfPlayer = stages.count
    var result = [Float]()
    var stop = stages.reduce(into: Array(repeating: 0, count: N+1)) { $0[$1-1] += 1 }

    for stage in 1...N {
        let remain = stop[stage-1]
        result.append(Float(remain)/Float(numOfPlayer))
        numOfPlayer -= remain
    }

    return result.enumerated().sorted {
        $0.element > $1.element
    }.map {
        $0.offset + 1
    }
}
  • tip: enumerated()의 반환값은 내부적으로 offset과 element 값을 지닌다.
  • Array를 기반으로 해결했기 때문에 정렬이 한번만 요구된다.

  • 풀이 1보다 빠른 속도로 모든 테스트 케이스를 통과했다.
반응형