Post

백준 2805번 python 풀이 - 나무 자르기

문제 링크

2805번

해결책

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys


def result_CutTree(arr, cut):
    result = 0
    for i in arr:
        if (i > cut):
            result += (i - cut)
    return result


def treeCuttingSearch(_min, _max, arr, target):
    triedList = []
    left, right = _min, _max
    mid = (left + right) // 2
    while (_min <= _max and mid not in triedList):
        triedList.append(mid)
        result = result_CutTree(arr, mid)
        if target == result:
            return mid
        elif target > result:
            right = mid - 1

        else:
            left = mid + 1

        mid = (left + right) // 2
    return mid


N, M = map(int, sys.stdin.readline().rstrip().split())
treeList = list(map(int, sys.stdin.readline().rstrip().split()))

treeList.sort()

print(treeCuttingSearch(0, treeList[-1] + 1, treeList, M))

주석으로 달 설명

이진탐색 2…!

이번에는 조금 독특한데… 이진탐색의 방향을 바꾼다.

만약 target과 result(자르고 남은 나무의 량)이 동일하다 하면 해당 값을 return 하는것이 최선이지만, 그렇지 않은 경우가 문제이다. 만약 target이 result보다 크다면, 즉 다시 말해 얻고자 하는 나무의 량이, 임의의 값을 넣었을 때, 얻어야 하는 나무의 량보다 적다면, right를 mid -1로 교체한다. 그렇게 하면, mid의 값이 감소하여, cutTree 함수에 넣었을 때 얻게 되는 나무의 량이 증가할 것이다. 반대의 경우, target 보다 result가 작다면, 얻고자 하는 나무의 량을 감소시켜야 한다. 이 때의 경우, mid의 값을 증가시켜, cutTree 함수에 넣었을 때 얻게 되는 나무의 량을 감소시킨다.

This post is licensed under CC BY 4.0 by the author.