https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
📌 해결순서
문제에서 요구하는 값이 절단기 높이의 최댓값이므로 조건을 만족하는 절단기의 높이를 작은값부터 최댓값이 될때까지 키워나가면 된다.
절단기의 높이가 높아질수록 상근이가 가져갈수 있는 나무는 적어진다
start = 0 / end = max(lst)
1. 절단기의 높이가 너무 짧은 경우
-> 이 경우에는 상근이가 가져가려는 나무의 길이보다 더 많은 나무가 잘리므로 현재 절단기의 높이보다 더 짧은 경우에 대해서 탐색하지 않는다.
따라서, start = mid + 1 로 설정
2. 절단기의 높이가 너무 긴 경우
-> 이 경우에는 상근이가 가져가려는 나무의 길이보다 더 적은 나무가 잘리므로 현재 절단기의 높이보다 더 긴 경우에 대해서 탐색하지 않는다.
따라서, end = mid - 1
📌 코드
import sys
input = sys.stdin.readline
if __name__ == "__main__":
n, m = map(int, input().split())
lst = list(map(int, input().split()))
ans = 0
start = 0
end = max(lst)
while start <= end:
length = 0
mid = (start + end) // 2
for tree in lst:
if tree > mid:
length += tree - mid
if length < m:
end = mid - 1
else:
ans = mid
start = mid + 1
print(ans)
'algorithm > Binary Search' 카테고리의 다른 글
백준 2792 보석상자 (1) | 2022.11.23 |
---|---|
백준 6236 용돈 관리 (0) | 2022.09.22 |
백준 3079 입국심사 (0) | 2022.09.22 |
백준 1654 랜선 자르기 (0) | 2022.09.22 |
백준 1920 수 찾기 (0) | 2022.09.22 |