[BOJ 1654] 랜선자르기 (java, 이진탐색)알고리즘/이진탐색2023. 6. 3. 20:52
Table of Contents
반응형
문제 링크
https://www.acmicpc.net/problem/1654
풀이
이진탐색 (매개변수 탐색) 풀이하면 되는 문제
문제 지문
K개 랜선이 있을때 필요한 랜선 N개를 만들기 위한 최대 랜선 길이 H를 구하시오.
뒤집은 지문 (매개변수 탐색*)
임의 길이 H로 랜선을 K개를 자를때, 필요한 랜선 N개를 만들 수 있는가? 이때 최대 랜선 길이 H는 얼마인가?
시간 복잡도
O(NlogN)
최대값
랜선의 길이 최대값이 2^31 - 1 이기 때문에 integer 연산시 overflow 발생가능하므로 long 으로 처리해야 함
제출코드
import java.util.*;
import java.io.*;
public class BOJ1654 {
static int K, N;
static long[] lines;
static void input() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken()); // 이미 보유한 랜선 수
N = Integer.parseInt(st.nextToken()); // 필요한 랜선 수
lines = new long[K];
for(int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
lines[i] = Long.parseLong(st.nextToken());
}
}
static boolean isValidHeight(int H) {
long total = 0;
for(long l : lines) {
long cnt = l / H;
total += cnt;
}
return N <= total;
}
static void pro() {
Arrays.sort(lines);
long result = 0;
long L = 0, R = Integer.MAX_VALUE;
while(L <= R) {
long height = (L + R) / 2;
if(isValidHeight((int)height)) {
L = height + 1;
result = height;
} else {
R = height - 1;
}
}
System.out.println(result);
}
public static void main(String[] args) throws Exception {
input();
pro();
}
}
반응형
'알고리즘 > 이진탐색' 카테고리의 다른 글
[BOJ 6236] 용돈 관리 (Java, 매개변수 탐색) (0) | 2023.06.05 |
---|---|
[BOJ 2343] 기타 레슨 (Java, 매개변수 탐색) (0) | 2023.06.05 |
[BOJ 1300] K번째 수 (Java, 이진탐색) (0) | 2023.06.03 |
[BOJ 2110] 공유기 설치 (java, 이진 탐색) (1) | 2023.06.03 |
[BOJ 2470] 두 용액 (java, 이진탐색) (0) | 2023.06.03 |
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!