Today 12/23
let KN = readLine()!.split(separator: " ").map{Int(String($0))!}
var lanArr = [Int]()
for _ in 1...KN[0] {
let input = Int(readLine()!)!
lanArr.append(input)
}
var min = 1
var max = lanArr.max()!
var output = 0
while min <= max {
let mid = (min + max) / 2
var count = 0
for lan in lanArr {
count += lan / mid
}
if count < KN[1] {
max = mid-1
} else {
min = mid+1
output = mid
}
}
print(output)
이분탐색으로 풀 수 있는 문제이다. 이분탐색을 이용한다는 점을 처음에 찾지 못해서 구글링의 도움을 받았다.
그 다음부터는 그냥 구현하면 되는 부분이라서 쉬웠고, 알던 사실들도 다시 한 번 정리했다.
while min <= max
로 while문을 돌린다는 점
for lan in lanArr
로 반복문을 간결하게 사용
보통은 클 때, 작을 때, 같을 때 3가지로 나눠서 조건문을 사용하는데, 이 문제의 경우에는 더 커도 된다는 조건이 들어가 있으므로 클 때랑 같을 때를 묶어서 반복문의 끝까지 돌려준다.