-
[Baekjoon Online Judge] 1654번: 랜선 자르기문제 풀이/Baekjoon Online Judge 2021. 2. 26. 17:10
요구사항
- 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.
- 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다.
- 편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정한다. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정한다. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성한다.
입력
- 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.
출력
- 첫째 줄에 N개를 만들 수 있는 랜선의 최대 길이를 센티미터 단위의 정수로 출력한다.
이분탐색을 진행하여 랜선을 자르고 개수를 늘려간다. 필요한 랜선의 개수가 n개 보다 크거나 같을 때 까지 이분탐색하며 적절한 랜선길이를 찾아간다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Baekjoon1654 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String[] input = bufferedReader.readLine().split(" "); int k = Integer.parseInt(input[0]); // 랜선의 개수 int n = Integer.parseInt(input[1]); // 필요한 랜선의 개수 int[] wires = new int[k]; int max = Integer.MIN_VALUE; for (int i = 0; i < k; i++) { wires[i] = Integer.parseInt(bufferedReader.readLine()); max = Math.max(max, wires[i]); } Arrays.sort(wires); // 오름차순 정렬 long start = 1; long end = max; while (start <= end) { long mid = (start + end) / 2; int count = 0; for (int wire : wires) count += wire / mid; if (count >= n) start = mid + 1; else end = mid - 1; } System.out.println(end); bufferedReader.close(); } }
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 11052번: 카드 구매하기 (0) 2021.02.26 [Baekjoon Online Judge] 10816번: 숫자 카드 2 (0) 2021.02.26 [Baekjoon Online Judge] 10815번: 숫자 카드 (0) 2021.02.25 [Baekjoon Online Judge] 2805번: 나무 자르기 (0) 2021.02.25 [Baekjoon Online Judge] 1920번: 수 찾기 (0) 2021.02.25