본문 바로가기
알고리즘/백준

[JAVA]백준_1654_랜선자르기

by 박 현 황 2021. 8. 31.

문제링크

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

 

기본적인 이분탐색 문제이다.

이분탐색 이해가 잘 안되어서 풀어보았다.

중간에 많이 틀렸는데 

left,right,mid 를 long형으로 해주어야 한다.

 

package BOJ;

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

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

public class Main_1654{
    static  int K,N;
    static int arr[];
    static int result = 1;// 랜선의 최대 길이 저장
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        K = Integer.parseInt(st.nextToken()); //가지고 있는 랜선의 개수
        N = Integer.parseInt(st.nextToken()); //필요한 랜선의 개수
        arr = new int[K];


        for(int i=0;i<K;i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(arr);

        long left = 1;
        long right = arr[K-1];
        while (left<=right){
            int cnt = 0;
            long mid = (left+right)/2;

            for(int i=0;i<K;i++){
                cnt += arr[i]/mid;
            }

            if(cnt >= N){
                result = (int) Math.max(mid,result);
                left = mid+1;
            }
            else{
                right = mid-1;
            }
        }

        System.out.println(result);
    }
}

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

[JAVA]백준_2933_미네랄  (0) 2021.09.14
[JAVA]백준_4779_칸토어집합  (0) 2021.09.09
[JAVA]백준_19942_다이어트  (0) 2021.08.09
[JAVA]백준_10816_숫자카드2  (0) 2021.08.07
[JAVA]백준_1920_수찾기  (0) 2021.08.07