본문 바로가기

스터디 1일 1커밋

240331 [BOJ/백준] 2805. 나무 자르기

 

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net


나의 코드

N, M = map(int, input().split())
arr = list(map(int, input().split()))

s, e = 0, max(arr)

while s <= e:
    middle = (s+e)//2
    ans = 0
    for i in arr:
        if i >= middle:
            ans += i-middle

    if ans >= M:
        s = middle+1
    else:
        e = middle-1
print(e)

 

결과


제일 높은 나무를 기준으로 중간값을 구해서 중간값보다 높은 나무들을 잘랐을 경우에 자른 길이의 합을 기준으로 중간값을 조정하는 방법의 이분탐색으로 문제를 풀었다. 아이디어는 찾아본 것으로....ㅎㅎ