코딩테스트/문제

[백준] 2805번 나무 자르기

스키(ski) 2023. 7. 3. 18:43
문제 내용

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

 

2805번: 나무 자르기

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

www.acmicpc.net

풀이 과정

-이분탐색으로 판단하고 문제풀이를 진행함.

풀이중 문제점

1.이분탐색 종료지점에 대한 불확실함.

 

문제점 해결 과정

1.start값의 변경을 통해 반복문을 탈출하였음.

 

해결 코드
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
import sys
 
sys_input=sys.stdin.readline
 
n,m=map(int,sys_input().rstrip().split())
trees=sorted(list(map(int,sys_input().rstrip().split()))) #정렬까지 시킴
 
end=trees[-1#가장 큰값을 끝으로 잡음 or 정렬 안시킬거면 max(trees)해도됨
start=1
 
while start<=end:
    mid=(start+end)//2
    cur=0
    for t in trees:
        if t>mid:
            cur+=t-mid
 
    if cur>m:
        start=mid+1
    elif cur<m:
        end=mid-1
    else:
        start=start+1
 
print(end) #start로 while을 탈출하기에 end가 답이됨
cs
주요 개념 
  • 이분 탐색(Binary Search)