본문 바로가기

알고리즘/백준 문제 풀이

[Python] 2805번 나무 자르기

728x90

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

 

2805번: 나무 자르기

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

www.acmicpc.net


22/08/28

 

보자마자 날먹 문제라고 생각했다.

 

이 문제는 그제 풀었던 1654번 랜선 자르기 문제와 거의 동일한 문제였기 때문이다.

 

단지 약간의 조건만 달랐다.

 


 

문제 접근 방법:

 

 

랜선 자르기 문제와 동일한데, 나무를 일정 간격으로 계속 자르는 게 아니라, 일정 높이를 두고 일정 높이 이상인 나무만 한 번 자른다는 점만 다르다.

 

다시 말해, 나누기를 하는게 아니라 빼기를 하는거다.

 

랜선 자르기 문제에 대한 해설은 아래에 있으니 참고하면 될 것 같다.


https://lighter.tistory.com/9

 

[Python] 1654번 랜선 자르기

https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000..

lighter.tistory.com


코드 또한 약간의 수정만 가했다. python3로 제출한 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 2805번 나무 자르기
# 이분 탐색, 매개 변수 탐색
'''
접근 방법:
랜선 자르기 문제와 거의 동일함.
'''
import sys
input = sys.stdin.readline

N, M = map(int, input().split())
trees = list(map(int, input().rstrip().split()))
def binary_search(low, high, N, arr):
    if low > high:
        return high
    mid = (low+high)//2
    total = 0
    for tree in arr:
        if tree - mid > 0:
            total += (tree-mid)
    if total >= N:
        return binary_search(mid+1, high, N, arr)
    else:
        return binary_search(low, mid-1, N, arr)

print(binary_search(0, max(trees), M, trees))