https://www.acmicpc.net/problem/2805
나무가 m 미터 이상 필요할 때, 절단기의 최대 높이 h를 구하는 문제다. 🌍💦
이진 탐색
은 정렬된 배열에서 타겟을 찾는 알고리즘으로, O(log n)의 시간복잡도를 가진다.
투 포인터로 배열의 범위를 절반씩 좁혀가며 탐색하면 편하다.
l = 0
r = max(trees)
h
을 이용해 값을 구하고, 범위를 좁혀줄 것이다.h = (l + r ) // 2
h
보다 높아 절단 된 나무의 길이를 모두 더해준다.total = sum( t-h if h < t else 0 for t in trees)
h
의 값을 check
변수에 할당한다.l
을 h + 1
로 할당시켜 범위를 좁혀준다.if total >= m:
check = max(check, h)
l = h + 1
r
을 h - 1
로 할당시켜 범위를 좁혀준다.else:
r = h - 1
import sys
input = sys.stdin.readline
# 나무 m미터가 필요, 절단기 높이 h
# 높이가 h보다 큰 나무들이 잘림
# 나무의 수 n, 필요한 나무 m
n, m = map(int, input().rsplit())
trees = list(map(int, input().rsplit()))
l, r = 0, max(trees)
check = 0
while l <= r:
h = (l + r) // 2
total = sum(t-h if h < t else 0 for t in trees)
if total >= m:
check = max(check, h)
l = h + 1
else:
r = h - 1
print(check)