[백준] 1654* 랜선 자르기 (실버2)

AI·2025년 9월 9일

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

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// left : 1, right : 가장 긴 길이
// 이진 탐색으로 적당한 길이 (N개를 만들수 있는 가장 긴 길이) 찾는다.
public class Main {
    static int K, N;
    static long left, right, mid;
    static int[] input;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        K = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        
        input = new int[K];
        
        // 입력을 받으면서 right 에 가장 긴 길이를 저장
        for (int i = 0; i < K; i++) {
            int n = Integer.parseInt(br.readLine());
            input[i] = n;
            if( right < n ) right = n;
        }
        left = 1;
        
        while( left <= right ) {
            long count = 0; // 중간값으로 만들 수 있는 랜선의 갯수
            
            mid = ( right + left ) / 2;
            
            for (int i = 0; i < K; i++) { // 중간값 mid 로 모든 K개의 길이를 나누어서 얻을 수 있는 랜선의 총 갯수를 계산
                count += (input[i] / mid);
            }
            
            // 더 큰 경우 : 여유가 있으니 mid 의 길이를 더 늘려도 좋다.
            // 같은 경우 : 810, 820, 830 => 3 개 각각을 800 으로 나누면 3개 => mid 의 길이를 더 늘려도 좋다.
            if( count >= N ) left = mid + 1;
            else right = mid - 1;
        }
        
//      System.out.println(left - 1); // 
        System.out.println(right);
    }
}

=>
재풀이(9/18) 성공

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

public class Main {
    static int k,n;
    static long[] lane;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        k = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        lane = new long[k];
        long hi = Integer.MIN_VALUE;
        for(int i=0;i<k;i++){
            int val = Integer.parseInt(br.readLine());
            lane[i] = val;
            if(hi<val) hi = val;
        }

        long lo = 1;
        while(lo<=hi){
            long mid = (hi+lo)/2;

            if(ok(mid)){
                hi = mid-1;
            } else{
                lo = mid+1;
            }
        }
        System.out.println(hi);
    }

    static boolean ok(long mid){
        long cnt = 0;
        for(int i=0;i<k;i++){
            cnt += lane[i]/mid;
        }
        if(cnt < n) return true;
        return false;
    }
}

오버플로우 발생할 수 있기에 long 사용
=> 자료형도 중요

0개의 댓글