[백준 2805] 나무 자르기

Junyoung Park·2022년 2월 26일
0

코딩테스트

목록 보기
94/631
post-thumbnail

1. 문제 설명

나무 자르기

2. 문제 분석

랜선 자르기와 마찬가지로 mid를 통해 원하는 기준이 충족된다면 기록해둔다.

3. 나의 풀이

n, m = map(int, input().split())

trees = list(map(int, input().split()))
trees.sort(reverse=True)
# 해당 높이보다 작다면 자를 수 없으므로 내림차순으로 정렬하자.

start, end = 0, trees[0]
# 자를 수 있는 높이는 0부터 가장 큰 나무의 높이까지

heights = []
while start <= end:
    mid = (start+end) // 2
    total = 0

    for tree in trees:
        if tree >= mid: total += tree - mid
        # mid 높이로 나무를 자를 때 얻을 수 있는 목재 길이의 합
        else: break
        # 더 이상 자를 수 없다면 그만둔다.

    if total >= m:
        # mid 높이로 잘랐을 때 total 길이의 목재를 얻을 수 있다. m보다 크다면 heights에 mid를 기록
        heights.append(mid)
        # 자르는 높이를 좀 더 높여보자.
        start = mid + 1
    else:
        end = mid - 1

print(max(heights))
# m 길이 이상의 목재를 얻을 수 있는 높이 중 가장 큰 값을 리턴한다.
profile
JUST DO IT

0개의 댓글