반응형
문제
https://programmers.co.kr/learn/courses/30/lessons/42889
풀이 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보다 빠른 속도로 모든 테스트 케이스를 통과했다.
반응형
'💻 CS > 알고리즘 연습' 카테고리의 다른 글
[알고리즘 연습] 조이스틱 (프로그래머스 lv2, 스위프트) (1) | 2022.02.17 |
---|---|
[알고리즘 연습] 행렬 테두리 회전하기 (프로그래머스 lv2, 스위프트) (0) | 2022.02.13 |
[알고리즘 연습] 비밀지도 (프로그래머스 lv1, 스위프트) (0) | 2022.02.05 |
[알고리즘 연습] 다트 게임 (프로그래머스 lv1, 스위프트) (0) | 2022.02.05 |
[알고리즘 연습] 시저 암호 (프로그래머스 lv1, 스위프트) (0) | 2022.02.02 |