2512번: 예산
문제 풀이 아이디어
- 완전탐색을 해도 답을 구할 수 있습니다.
- 하지만 이진탐색을 활용하면 더 빠르게 구할 수 있습니다.
- 이진탐색을 활용해서 조건에 만족하는 최댓값 (혹은 최솟값)을 찾는 것을 파라메트릭 서치라고 합니다.
- 어떤 예산이 “총 예산 조건"을 만족하는 "최댓값"인지 구하면 됩니다.
코드
let N = Int(readLine()!)!
let requests = readLine()!.split(separator: " ").map { Int(String($0))! }
let limit = Int(readLine()!)!
func parametricSearch() -> Int {
var start = 0
var end = requests.max()!
var mid = (start + end) / 2
while start <= end {
let totalBudget = requests.reduce(0) { $0 + ($1 < mid ? $1 : mid) }
if totalBudget > limit {
end = mid - 1
} else {
start = mid + 1
}
mid = (start + end) / 2
}
return mid
}
print(parametricSearch())