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)