지니 코딩일기

[백준] #2805 - 나무 자르기 본문

알고리즘/BOJ

[백준] #2805 - 나무 자르기

zzzl 2023. 8. 11. 17:58

2023/7/16

실버2

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

 

2805번: 나무 자르기

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

www.acmicpc.net

 

 

🔎 분석

이분탐색 문제를 풀려고 선택한 문제. 이분탐색을 적용하면 되는 단순한 문제였다.

이분탐색 없이 그냥 접근하면 시간초과가 뜬다.

재귀로 이분탐색을 적용하고 예제를 돌렸는데, 이상하게 return값이 제대로 안 나왔다. 이유는 아직도 모르겠다 ㅠ 그래서 그냥 print 하도록 하여서 맞았습니다가 나왔다.

그리고 numpy 라이브러리를 썼더니 런타임에러(not find module)가 나왔다 !! 주의하자.

 

 

📍TIP

시간이 2132ms가 나와서 좀 줄여보고자 재귀 대신 while문을 사용했는데, 그랬더니 오히려 4856ms로 2배 가량의 시간이 나왔다.

재귀가 while문보다 빠른 것 같다.

 

💻 코드

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
tree_heights = list(map(int, input().split()))
H = 0
tree_heights = sorted(tree_heights)

def binary_search(a, l, r, M):
    mid = (l+r)//2

    if l<=r:
        sum_ = 0
        for tree in a:
            if tree>mid:
                sum_ += tree-mid

        if sum_ < M:
            binary_search(a, l, mid-1, M)
        elif sum_ >= M:
            binary_search(a, mid+1, r, M)
    else:
        print(mid)
        return mid

result_height = binary_search(tree_heights, 0, max(tree_heights), M)

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] #3079 - 입국심사  (0) 2023.08.18
[백준] #2792 - 보석상자  (0) 2023.08.18
[백준] #17089 - 세 친구  (0) 2023.08.09
[백준] #11931 - 수 정렬하기 4  (0) 2023.08.09
[백준] #2164 - 카드2  (0) 2023.08.09