[백준] 1654번 랜선자르기 - Java
문제 출처
※ 풀이
단순하게 생각하면 처음부터 1씩 줄여가면서 브루트포스 완전탐색으로 답을 찾아나가면 되지 않을까 생각이 들 수 있는데
이 문제에는 몇가지 함정이 있다.
처음부터 하나씩 다 해보면 데이터가 생각보다 커서 시간 초과가 뜰 수 있다는 것이고,
또 생각없이 int 로 자료형을 선언하면 자료형에 의한 에러가 뜰 수 있다.
따라서 int 자료형으로 커버가 안되는 데이터들은 long 으로 선언하고
이분 검색을 통해서 자료 탐색시간을 크게 줄여나가야 한다.
소스코드는 아래와 같다.
※ 소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
//input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int[] lens = new int[k];
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
lens[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(lens);
long left = 1;
long right = lens[lens.length - 1];
while (left <= right) {
long middle = (left + right) / 2;
long sum = 0;
for (int i = 0; i < k; i++) {
sum += lens[i] / middle;
}
if (sum >= n) {
left = middle + 1;
} else {
right = middle - 1;
}
}
System.out.println(right);
}
}