이분 탐색 문제. 기준이 되는 높이를 중간값으로 선정한 뒤 이 높이로 나무를 잘랐을 때 가져갈 수 있는 총 길이
total
과 목표 길이M
을 비교하자.M
이상을 만족한다면 이 높이mid
를 자르는 게 허용되고, 이 중 최댓값을 찾아 기록.
import Foundation
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M) = (input[0], input[1])
var trees = readLine()!.split(separator: " ").map{Int(String($0))!}
trees.sort(by: >)
var left = 0
var right = trees[0]
var answer = 0
while left <= right {
let mid = (left + right) / 2
var total = 0
for tree in trees {
if tree >= mid {
total += (tree - mid)
} else {
break
}
}
if total >= M {
answer = max(answer, mid)
left = mid + 1
} else {
right = mid - 1
}
}
print(answer)