본문 바로가기

CodingTEST

[백준 1654] 랜선 자르기 (JAVA)

반응형

백준 1654번 문제 - 랜선 자르기

 

1654번: 랜선 자르기

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

www.acmicpc.net


문제 분석

 

 

 

  • K개의 서로 다른 길이의 랜선을 가지고 N개의 동일한 길이의 랜선을 제작하고자 한다.
  • 이때 가장 N개의 랜선을 만들 수 있는 가장 긴 길이를 출력해라.

해결 키 포인트

 

  • K개의 랜선 길이 합을 구하고, 합을 N으로 나눴을 때 값을 알아낸다 : 할 수 있는 최대 랜선 길이 (max)
  • 방법 1 : 1부터 max까지 11개를 만들 수 있는 최대 길이 구하기 
    • 실패 ! 시간 초과
  • 방법 2 :  이진탐색으로 1부터 max까지 11개를 만들 수 있는 최대 길이 구하기
    • 성공 ! 
    • mid구하는 법 : (low+high) / 2
    • low 값을 0으로 하면 컴파일 오류 발생하므로 low를 1로 설정

코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int K = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

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

        long result = 0;

        long low = 1, high = sum / N;
        while(low <= high) {
            long mid = (high + low) / 2;
            int count = 0;
            for (int j = 0; j < K; j++) {
                count += nums[j] / mid;
            }
            if (count >= N) {
                result = Math.max(result, mid);
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }

        bw.write(result + "\n");
        bw.flush();
        bw.close();
    }
}
반응형

'CodingTEST' 카테고리의 다른 글

[백준 1966] 프린터 큐 (JAVA)  (0) 2023.11.30
[백준 2108] 통계학 (JAVA)  (1) 2023.11.30
[백준 18111] 마인크래프트 (JAVA)  (2) 2023.11.24
[백준 14503] 로봇 청소기 (JAVA)  (0) 2023.11.23
[백준 2573] 빙산 (JAVA)  (0) 2023.11.23