[백준] 1654 랜선자르기
이분탐색 재밌당…!
그냥 랜선 쭉 받은다음에 정렬하고, 큰 길이부터 쭉쭉 탐색하면서 내가 정한 기준 길이를 몇개나 만들어낼 수 있는지 합산해주면 된다.
자세한 내용은 주석으로~!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
class Main{
static int ip(String s){ return Integer.parseInt(s); };
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int k = ip(st.nextToken());
int n = ip(st.nextToken());
int[] lans = new int[k]; // 랜선 길이를 입력받자
for(int i = 0 ; i < k ; i++) {
lans[i] = ip(br.readLine());
}
Arrays.sort(lans); // 오름차순으로 정렬(뭐든 딱히 상관없음)
long l = 1; // 최소 길이
long r = lans[k-1]; // 최대 길이(이 값이 최대가 나오면 터지기 때문에 ㅠㅠ long으로 입력받자.
long ans = 0; // 정답길이가 저장될 변수
while(l <= r) { // 이분탐색 ㄱㄱ
long mid = (l+r)/2; // 중간값을 기준으로
int cnts = 0; // mid길이를 만들어낼 수 있는 최대 랜선갯수를 저장
for(int i = k-1 ; i >=0 ; i--) { // 큰 길이들 부터 조사
int cnt = (int)(lans[i]/mid); // 이 길이 몇개나 만들어주실 수 있으세요?
if(cnt < 1) break; // 한개도 못만드신다구여? 나갈게요..
cnts += cnt; // 저장
}
if(cnts >= n) { // n개보다 더 만들었다면
l = mid + 1; // 길이를 늘려보자
ans = mid; // 저장
}else { // n개보다 모자르다면
r = mid - 1; // 길이를 줄여보자
}
}
System.out.println(ans);
}
}
Comments