https://www.acmicpc.net/problem/1654
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// left : 1, right : 가장 긴 길이
// 이진 탐색으로 적당한 길이 (N개를 만들수 있는 가장 긴 길이) 찾는다.
public class Main {
static int K, N;
static long left, right, mid;
static int[] input;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
K = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
input = new int[K];
// 입력을 받으면서 right 에 가장 긴 길이를 저장
for (int i = 0; i < K; i++) {
int n = Integer.parseInt(br.readLine());
input[i] = n;
if( right < n ) right = n;
}
left = 1;
while( left <= right ) {
long count = 0; // 중간값으로 만들 수 있는 랜선의 갯수
mid = ( right + left ) / 2;
for (int i = 0; i < K; i++) { // 중간값 mid 로 모든 K개의 길이를 나누어서 얻을 수 있는 랜선의 총 갯수를 계산
count += (input[i] / mid);
}
// 더 큰 경우 : 여유가 있으니 mid 의 길이를 더 늘려도 좋다.
// 같은 경우 : 810, 820, 830 => 3 개 각각을 800 으로 나누면 3개 => mid 의 길이를 더 늘려도 좋다.
if( count >= N ) left = mid + 1;
else right = mid - 1;
}
// System.out.println(left - 1); //
System.out.println(right);
}
}
=>
재풀이(9/18) 성공
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int k,n;
static long[] lane;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
k = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
lane = new long[k];
long hi = Integer.MIN_VALUE;
for(int i=0;i<k;i++){
int val = Integer.parseInt(br.readLine());
lane[i] = val;
if(hi<val) hi = val;
}
long lo = 1;
while(lo<=hi){
long mid = (hi+lo)/2;
if(ok(mid)){
hi = mid-1;
} else{
lo = mid+1;
}
}
System.out.println(hi);
}
static boolean ok(long mid){
long cnt = 0;
for(int i=0;i<k;i++){
cnt += lane[i]/mid;
}
if(cnt < n) return true;
return false;
}
}
오버플로우 발생할 수 있기에 long 사용
=> 자료형도 중요