JAVA/Coding Test

[JAVA] 백준 1654 랜선자르기_이분탐색

오늘도개발 2024. 6. 4. 20:18

 

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

 

 

접근 : 

 

 - 랜선을 특정한 이분 탐색을 통하여 자른다.

 

 - 만약 자른 갯수가 목표치 이상이면, left = mid + 1 보다 작으면 right = mid - 1 로 끝까지 진행한다. 

 

 - 탐색이 완료되는 곳을 정답으로 출력한다.

 

 

 

코드구현 

 

import java.io.*;
import java.util.*;

public class Main {

    private static boolean calFunc(int[] nums, long mid, int target ){
        long temp_res = 0;
        for(int num : nums){
            temp_res += num / mid; 

            if(temp_res >= target) return true;
        }
        return false;
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] temp = br.readLine().split(" ");        
        int k = Integer.parseInt(temp[0]);
        int n = Integer.parseInt(temp[1]);

        int[] nums = new int[k];

        for(int i = 0; i < k ; i++) nums[i] = Integer.parseInt(br.readLine());

        long left = 1;
        long right = Integer.MAX_VALUE;
        long mid = 0;
        long answer = 0;

        while (left <= right) {
            mid = (left + right) / 2;

            if(calFunc(nums, mid, n)){
                answer = mid;
                left = mid + 1;
                continue;
            }
            right = mid - 1;
        }

        System.out.println(answer);
        br.close();
    }
}