본문 바로가기

알고리즘/백준

[백준] 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

해당 문제는 아래의 문제에서 최소값을 구하는과정을 추가된 경우이다.

https://bigkwangs.tistory.com/38

 

[백준] 2110번 : 공유기 설치

https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집

bigkwangs.tistory.com

적어도 M미터의 나무를 집에 가져가기 위해서 절단기에 설정할 수 있는 높이의 최댓값을 구해야 함으로 나무를 집에 가져기가위한 값을 최소값을 찾아서 그 최소값을 갖는 높이의 결과를 리턴하면 된다.

 

N, M = map(int, input().split()) # 나무의 개수, M미터의 나무를 가져가야함.

tree = list(map(int ,input().split()))
    
tree.sort() # 이분 탐색을 위해 정렬한다.

start = 1
end = tree[-1]

result = int(10e9)
ans = 0
if N == 1:
    print(tree[0] - M)
else:
    while start < end:
        mid = ( start + end ) // 2 # H값을 선정
        sum = 0
        for i in range(N):
            cost = tree[i] - mid
            if cost > 0:
                sum += cost
            
        if sum >= M: # 값이 큰경우 작은 범위로 탐색하게 한다. 높이를 늘린다.
            if result > sum:
                result = sum
                ans = mid
            start = mid+1
        else: # 값이 작은경우 큰 범위로 탐색하게 한다. 높이를 낮춘다.
            end = mid
              
    print(ans)
728x90

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

[백준] 15649번 : N과 M(1)  (0) 2023.07.18
[백준] 9663번 : N-Queen  (0) 2023.07.18
[백준] 2110번 : 공유기 설치  (0) 2023.07.17
[백준] 5639번 : 이진 검색 트리  (0) 2023.07.17
[백준] 5052번 : 전화번호 목록  (0) 2023.07.17