Jun's Development Journey
[BOJ] 1654 랜선 자르기 본문
문제
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
풀이
랜선 길이의 최대값이 2^31 -1 이기 때문에 길이를 1부터 최대 길이까지 범위로 찾는 방식으로 풀면 시간 초과가 나올 것이다.
그러므로 범위를 줄여나가며 풀어야겠다고 생각했다. 찾아볼 범위의 시작을 start = 1이라 하고 범위의 끝은 end라고 했다. end는 랜선길이중 최대값 일 것이다. 중간값을 mid이라 했다.
mid로 k개의 랜선을 잘랐을 때 개수가 n개 이상이면 최대길이는 적어도 mid값 이상이므로 start = mid+1;
n개 이하이면 최대길이는 적어도 mid값 이하이므로 end = mid-1; 로 해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static boolean chk_cnt(long[] lens, long leng, int N) {
long cnt =0 ;
for(long len : lens) {
cnt+= len/leng;
}
return cnt>=N;
}
public static long binary_search(long[] lens, int N) {
long result=0;
long max_len=0;
long start = 1, end, mid=0;
//K개의 랜선 중 최대 길이 찾기
for(long len : lens) {
max_len = Math.max(max_len,len);
}
//이진 탐색 시작
end = max_len;
while(start<=end) {
mid = (start+end)/2;
if(chk_cnt(lens,mid,N)) {
result = Math.max(result, mid);
start = mid+1;
}
else {
end = mid-1;
}
}
return result;
}
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
//선언 및 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N,K;
long lens[];
st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
lens = new long[K];
for(int i=0;i<K;i++)
lens[i] = Integer.parseInt(br.readLine());
//계산
System.out.println(binary_search(lens,N));
}
}
'BOJ > Binary Search' 카테고리의 다른 글
[BOJ] 16510번 Predictable Queue (0) | 2021.05.07 |
---|