백준 / 2805 / 나무 자르기 / java

맹민재·2023년 5월 31일
0

Java

목록 보기
18/32
package K이분탐색;

import java.util.Scanner;
import java.util.Arrays;
public class 나무자르기 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[] tree = new int[n];

        for(int i=0; i<n; i++){
            tree[i] = sc.nextInt();
        }
        sc.close();
        long start = 0, end = Arrays.stream(tree).max().getAsInt()+1;

        long mid = 0;
        while(start < end){
            mid = (start + end) / 2;

            long cut = 0;
            for(long i:tree){
                if(i > mid){
                    cut += i - mid;
                }
            }

            if (cut < m){
                end = mid;
            } else {
                start = mid + 1;
            }
        }

        System.out.println(start -1);
    }
    
}

이분 탐색의 Upper Bound 방식으로 해결하는 알고리즘

Upper Bound는 이분탐색으로 최대값을 구할 때 사용된다.
이 문제는 절단할 나무의 최대 값을 구해야 하는 문제이므로 Upper Bound 방식으로 해결해야한다.

Upper bound에서 주의 할 점은 end는 max 값에서 +1로 구해야하며 start - 1 로 답을 구한다는 점이다.


예전에 python으로 풀 때는 lower, upper 개념도 모르고 그냥 코드를 외워서 풀었었다. 그러다 보니 이분탐색에서 새로운 문제를 만나게 되면 start와 end를 어떻게 바꿀지, 정답으로 start, end, mid 어떤걸로 해야하는지 알 수 없었다.

이번에 풀면서 다행이 이러한 개념을 알게되었다.

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글