본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 1654번 랜선 자르기

by 현장 2026. 1. 9.

-Code

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

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

        int cableCnt = Integer.parseInt(st.nextToken());
        int needCableCnt = Integer.parseInt(st.nextToken());
        // 최대 길이를 구하면서 배열에 저장
        int maxLangth = 0;
        int[] lanCables = new int[cableCnt];
        for (int i = 0; i < cableCnt; i++) {
            lanCables[i] = Integer.parseInt(br.readLine());
            maxLangth = Math.max(maxLangth, lanCables[i]);
        }
        // 출력
        System.out.println(getMaxCableLength(maxLangth, needCableCnt , lanCables));
    }
	
    private static long getMaxCableLength(int maxLangth, int needCableCnt, int[] lanCables) {
        // 이분 탐색으로 최대 길이 구하기
        long answer = 0;
        long left = 1, right = maxLangth;
		// 왼쪽 포인터가 오른쪽 포인터 이하인 경우 반복
        while (left <= right) {
            // 중간 지점 계산
            long mid = (left + right) / 2;
			// 만들 수 있는 케이블 갯수 비교후 포인터 변경
            if (getCableCnt(mid, lanCables) < needCableCnt) {
                // 해당 길이로 만들 수 있는 케이블 갯수가 필요한 케이블이
                // 적은 경우 mid 감소를 위한 right 값을 mid - 1로 변경
                right = mid - 1;
            } else {
                // 만들수 있는 갯수가 필요 케이블 보다 많으면 최대값 비교 및 저장
                answer = Math.max(answer, mid);
                // 크기를 크게하기 위해 왼쪽 포인터를 mid + 1로 변경
                left = mid + 1;
            }
        }
        return answer;
    }
	// 만들수 있는 케이블 갯수 구하기
    private static int getCableCnt(long length, int[] lanCables) {
        int cnt = 0;
        for (int cable : lanCables) {
            cnt += (int) (cable / length);
        }
        return cnt;
    }
}

처음에 메소드 반환을 이상하게 해서 틀렸습니다. 그냥 변수를 하나두고 가능한 모든 길이를 비교하면서 끝까지 비교 후 값을 반환해주면 되었습니다.