9 3
1 2 3 4 5 6 7 8 9
>>> 17
모든 강의 길이의 합 = 45인데 왜 블루레이 크기 중 최소가 17일까? 1, 2, 3, 4, 5가 1번이고 6, 7이 2번이고 8, 9가 3번인데 크기가 각각 15, 13, 17이라 17 밑으로는 블루레이 크기가 될 수 없기에 최솟값이 17이 된다.
기존 이진탐색 알고리즘을 살펴보자.
def binary(array, target):
left, right = 0, len(array) - 1
while left <= right:
mid = (left + right) // 2
if array[mid] < target:
left = mid + 1
elif array[mid] > target:
right = mid - 1
else:
return mid
return -1
여기서 left, right를 정의하는 과정에서 시작해야하는 값과 가장 큰 값을 정의해야 해줘야 한다. 만약 시작을 해야한다면 적어도 2개 이상 서로 더하지 않고 길이 중 가장 큰 값을 left로 하고 right를 전체 길이의 합으로 정의를 하게 되면 다음과 같이 나오게 된다.
N, M = map(int, input().split())
length = list(map(int, input().split()))
left, right = max(length), sum(length)
answer = 0
while left <= right:
mid = (left + right) // 2
current_total = 0
current_count = 0
for i in length:
if current_total + i > mid:
current_count += 1
current_total = i
else:
current_total += i
if current_count <= M - 1:
answer = mid
right = mid - 1
else:
left = mid + 1
print(answer)