반응형
https://www.acmicpc.net/problem/1654
[풀이과정]
이분탐색 문제다.
오랜만에 풀어서 로직이 헷갈렸는데 mid 값 갱신 시 +1, -1 해주기. low는 0으로 두지 말기. 두 가지 복기하자.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
K개의 랜선 보유 - 길이가 다 다름
N개의 같은 길이의 랜선으로 만들기 위해 K개의 랜선을 자르기
(ex. 300cm : 140cm 두 개를 위해 20cm 버려야 함)
N개보다 많이 만드는 것도 N개를 만드는 것에 포함.
만들 수 있는 최대 랜선의 길이 구하기
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int K, N;
static long max, result;
static long[] lines;
public static void main(String[] args) throws IOException {
init();
binarySearch();
/*
[출력]
N개를 만들 수 있는 랜선의 최대 길이
*/
System.out.println(result);
}
static void init() throws IOException{
/*
[입력]
1. 랜선의 개수 K, 필요한 개수 N (1<=K<=10,000, 1<=N<=1,000,000, K<=N)
2~K. 각 랜선의 길이 (2^32-1)
*/
st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
lines = new long[K];
for(int k = 0; k < K; k++){
lines[k] = Long.parseLong(br.readLine());
max = Math.max(max, lines[k]);
}
}
static void binarySearch(){
long mid;
long low = 1;
long high = max;
while(low <= high){
mid = (low + high)/2;
long cnt = slice(mid);
if(cnt >= N){
result = Math.max(result, mid);
low = mid + 1;
}
else {
high = mid - 1;
}
}
}
static long slice(long length){
long cnt = 0;
for(int k = 0; k < K; k++){
cnt += (lines[k] / length);
}
return cnt;
}
}

반응형
'백준 > 이분탐색' 카테고리의 다른 글
[백준] 2805 : 나무자르기 (JAVA) (0) | 2025.04.07 |
---|---|
[백준] 1477 : 휴게소 세우기 (JAVA) (0) | 2024.11.13 |
[백준] 12945 : 재미있는 박스 정리 (0) | 2023.09.06 |
[백준] 2470 : 두 용액 (0) | 2023.04.06 |