알고리즘
[Swift 알고리즘] 백준 2512 예산
코코종
2023. 4. 26. 18:07
728x90
안녕하세요 코코종입니다.
어제 bfs랑 싸우다가 너무 힘들어서... 탐색에서 도망쳤습니다(도망친곳이 이분 '탐색'ㅋㅋㅋㅋ)
//
// main.swift
// BackJoon
//
// Created by kokojong on 2023/04/26.
//
import Foundation
// 백준 2512 예산 이분탐색 실3
let n = Int(readLine()!)!
let arr: [Int] = readLine()!.split(separator: " ").map { Int(String($0))! }
let m = Int(readLine()!)!
var answer = 0
// idea: 제일 큰 수에서 부터 이분탐색으로 찾기
func binarySearch(l: Int, r: Int) {
let mid = (l + r) / 2
if mid == l || mid == r { // left가 Mid랑 같아짐 -> 탐색 종료
return
}
var total = 0
for a in arr {
if a > mid { total += mid }
else { total += a }
}
// print("total", total, "l, mid, r", l, mid, r)
if total > m { // 상한이 너무 높음
binarySearch(l: l, r: mid)
} else {
answer = max(answer, mid)
binarySearch(l: mid, r: r)
}
}
if arr.reduce(0, +) <= m {
answer = arr.max()!
} else {
binarySearch(l: 0, r: arr.max()!)
}
print(answer)
아이디어는 간단합니다. 최고 요청 금액과 0원 사이에서 binary search를 해주면 됩니다!
참고로 min == r에 대한 조건은 빼도 되는데 실수로 들어갔답니다. 머-쓱
(처음에 0~max로 했다가 뭐에 홀려서 min~max로 했다가 틀린 어이없는 일이...)
728x90