Algorithm/백준(파이썬)
백준 2805 파이썬(Python) 문제풀이 나무자르기
김상주
2023. 4. 19. 20:14
문제링크:https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
다루는 주제: 이분 탐색
import sys
def binary(arr, start, end):
result = 0
while start <= end: # end가 start보다 낮거나 같아질떄까지 반복한다.
middle = (start + end) // 2
total = 0 # 가져갈수있는 나무길이 총합
for tree in arr:
if tree > middle: # 나무길이가 중간값보다 크면
total += tree - middle # 나무길이 - 중간값 즉 가져갈 나무길이를 total에 저장
if total < M: # 가져갈 나무길이의 총합이 M에 미치지못하면
end = middle - 1 # 자를 높이를 낮춰준다.
else:
result = middle # 아니라면 자른 높이를 결과값에 저장 후
start = middle + 1 # 자를 높이를 높혀준다.
return result
N, M = map(int, sys.stdin.readline().split())
treeList = list(map(int, sys.stdin.readline().split()))
a = binary(treeList, 0, max(treeList))
print(a)