간단한 이분탐색 문제이다.
left = 1
right = sum(li) // N
left를 1, right를 전체 랜선을 이어 붙였을 때 나올 수 있는 개수로 지정한 뒤
이분탐색 진행한다.
if tmp < N:
right = mid - 1
else:
left = mid + 1
나올 수 있는 랜선의 길이가 N개보다 작다면 더 작은 길이로 나눠야 하기 때문에 right를 mid - 1로 만들어 다시 진행한다.
나올 수 있는 랜선의 길이가 N개보다 크거나 같다면 나올 수 있는 더 큰 길이를 탐색하기 위해 left를 mid + 1로 만들어 다시 진행한다.
left가 right보다 커졌을 경우 반복문을 중단하며, right(나올 수 있는 최대값)를 출력한다
K, N = map(int, input().split())
li = []
for _ in range(K):
li.append(int(input()))
left = 1
right = sum(li) // N
mid = (left + right) // 2
while left <= right:
mid = (left + right) // 2
tmp = 0
for i in li:
tmp += i // mid
if tmp < N:
right = mid - 1
else:
left = mid + 1
print(right)