알고리즘

백준 2805번 나무 자르기 (JAVA)

박카스마시며코딩 2023. 11. 11. 16:38

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

 

2805번: 나무 자르기

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

www.acmicpc.net

 

저는 이분탐색을 통해 문제를 해결하였습니다.

브루트포스로 할 경우 n*m의 시간복잡도이기 때문에 시간초과가 나올 것이라 판단하여 이분탐색을 통해 시간복잡도 n*log(m)으로 하여 문제를 풀었습니다.

 

 

package BOJ.binarysearch;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_2805 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[] num = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            num[i] = Integer.parseInt(st.nextToken());
        }
        long result = cal(num, n, m);
        System.out.println(result);
    }

    private static long cal(int[] num, int n, int m) {
        long start = 0;
        long end = 2_000_000_000;
        long result = 0;
        while (start <= end) {
            long mid = (start + end) / 2;
            long temp = check(num, mid, n);
            if (temp >= m) {
                result = mid;
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return result;
    }

    private static long check(int[] num, long mid, int n) {
        long sum = 0;
        for(int i = 0 ; i < n ; i++){
            if(num[i] > mid){
                sum += num[i]- mid;
            }
        }
        return sum;
    }

}

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

백준 1655번 가운데를 말해요 (JAVA)  (0) 2023.11.13
백준 11399번 ATM (JAVA)  (0) 2023.11.12
백준 2003번 수들의 합2 (JAVA)  (0) 2023.11.10
백준 1107번 리모컨 (JAVA)  (0) 2023.11.09
백준 14891번 톱니바퀴 (JAVA)  (0) 2023.11.08