문제설명
동빈이네 떡볶이 떡은 길이가 일정하지 않다. 대신에 한 봉지 안에 들어가는 떡의 총 길이는 절단기로 잘라서 맞춰준다. 절단기에 높이(H)를 지정하면 줄지어진 떡을 한 번에 절단한다. 높이가 H보다 긴 떡은 H위의 부분이 잘릴 것이고, 낮은 떡은 잘리지 않는다.
예를 들어, 높이가 19, 14, 10, 17 cm인 떡이 있고 절단기 높이를 15cm로 지정하면 자른 뒤 떡의 높이는 15, 14, 10, 15cm가 될 것이다. 그리고 잘린 떡의 길이는 차례대로 4, 0, 0, 2cm가 된다. 이 때 손님은 잘린 떡의 길이의 총 합인 6cm의 길이를 가져간다.
손님이 왔을 때 요청한 총 길이가 M일 때 적어도 M만큼의 떡을 얻기 위해 절단기에 설정할 수 있는 높이의 최댓값을 구하는 프로그램을 작성하시오
입력조건
- 첫째 줄에 떡의 개수 N과 요청한 떡의 길이 M이 주어진다(1 <= N <= 1,000,000, 1 <= M <= 2,000,000,000)
- 둘째 줄에는 떡의 개별 높이가 주어진다. 떡 높이의 총합은 항상 M 이상이므로 손님은 필요한 양만큼 떡을 사갈 수 있다. 높이는 10억보다 작거나 같은 양의 정수 또는 0이다.(0 <= H <= 10억)
이진탐색 문제인걸 알고 봤는데도 무엇을 이진탐색으로 찾아야 이 문제를 풀 수 있을지 한동안 고민했다.
고민 결과, 떡을 자를 절단기의 높이를 이진탐색으로 찾아야 한다는 결론이 나왔다.
결론이 나온후에는 구현이 그리 어렵지 않았다.
def binary_search(rices, arr, target, start, end):
if start > end:
return None
mid = (start + end) // 2
total = 0
for rice in rices:
if arr[mid] < rice:
total += rice - arr[mid]
if total == target:
return arr[mid]
elif total < target:
return binary_search(rices, arr, target, start, mid - 1)
else:
return binary_search(rices, arr, target, mid + 1, end)
l = [19, 15, 10, 17]
temp = [x for x in range(1, max(l) + 1)]
print(binary_search(l, temp, 6, 0, len(temp) - 1))