본문 바로가기
알고리즘

[백준 1654] 랜선 자르기 [java]

by 근즈리얼 2021. 5. 4.
728x90


이분 탐색 문제로 풀었다.

 

이 문제에서 두 가지 주의할 점이 있는데

 

하나는 범위가 커서 long형으로 선언해야하는 점과 문제에서 랜선의 길이는 자연수라는 점이다.

 

우선 랜선의 길이는 1부터 주어진 랜선들 중 가장 긴 랜선의 길이가 될 수 있다.

따라서 1과 가장 긴 랜선의 길이의 평균 값을 기준으로 위아래로 찾아보면 된다.

 

코드

package baekjoon;

import java.util.Scanner;

public class cut_lanwire {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int k = scan.nextInt();
        long n = scan.nextLong();
        long arr[] = new long[k];
        long max = 0;

        for(int i = 0;i<k;i++){
            arr[i] = scan.nextLong();
            max = Math.max(max,arr[i]);
        }

        long left = 1;
        long right = max;

        while(left<=right){
            long mid = (right+left)/2;
            long sum = 0;
            for(int i = 0; i<k;i++){
                // 중간 값으로 배열값들을 나누면 개수가 나옴
                sum += arr[i]/mid;
            }
            if(sum >= n){ // sum이 더 많으면 자르는 길이를 늘릴 필요가 있음
                left = mid+1;
            }else{ // sum이 더 적으면  자르는 길이를 줄일 필요가 있음
                right = mid-1;
            }
        }
        System.out.println(right);
    }
}
728x90

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

순환의 응용 : n queens problem  (0) 2021.05.05
순환의 응용 - 미로찾기  (0) 2021.05.05
[백준10816] 숫자 카드 2[java]  (0) 2021.05.04
순환의 개념과 기본예제 3  (0) 2021.05.01
순환의 개념과 기본예제 2  (0) 2021.05.01

댓글