문제 출처 : https://www.acmicpc.net/problem/1654
문제 풀이 :
주어진 랜선의 총 개수 K, 만들어야 할 랜선 개수 N일 때
이분 탐색을 이용해 각 랜선을 쪼개어서 총 N개를 만족하는 최대 랜선 길이를 구해야 한다.
이진 탐색의 범위는
low : 1 cm
high : 랜선 배열 중 가장 긴 랜선
주의 사항은 랜선 배열의 각 랜선의 길이가 ' 2의31승-1보다 작거나 같은 자연수' 라고 했으므로
변수 타입을 long 타입으로 지정해주어야 하고,
최대 랜선 길이 값이 N개 이상으로 나뉘어질 수 있을 때에만 업데이트 될 수 있도록 해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class boj1654 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int K, N = 0; // 랜선의 개수 k, 필요한 랜선의 개수 N
long[] lans; // 랜선 배열
String input = br.readLine();
String[] parts = input.split(" ");
K = Integer.parseInt(parts[0]);
N = Integer.parseInt(parts[1]);
lans = new long[K];
for (int i = 0; i < K; i++) {
input = br.readLine();
lans[i] = Long.parseLong(input);
}
Arrays.sort(lans);
// 최대 랜선 길이값 찾기
long low = 1;
long high = lans[K-1];
long maxLan = 0;
while (low <= high) {
long mid = (high + low) / 2;
int divCnt = 0;
for (int i = 0; i < K; i++) {
divCnt += lans[i] / mid;
}
if (divCnt >= N) {
// N 개 이상 만들 수 있을 때에만 maxLen값 update
maxLan = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
System.out.println(maxLan);
}
}
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
백준 2161 - 카드1(Java) 구현 (0) | 2025.03.19 |
---|---|
백준 2559 수열 (Java/자바) 슬라이딩 윈도우 (0) | 2024.10.29 |
[백준] 1260 DFS와BFS (자바/java) (0) | 2021.12.22 |
[백준] 1991 트리 순회(자바/java) (0) | 2021.12.14 |
[백준] 2563 색종이 (자바/java) (0) | 2021.12.03 |