코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static long N, M;
private static final long MAX_TIME = (long) 1e9;
static ArrayList<Long> timeToCheck = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Long.parseLong(st.nextToken());
M = Long.parseLong(st.nextToken());
for (int i = 0; i < N; i++) {
timeToCheck.add(Long.parseLong(br.readLine()));
}
long result = binarySearch(1L, MAX_TIME * M);
System.out.println(result);
}
private static long binarySearch(long startTime, long endTime) {
long mid = (startTime + endTime) / 2;
if (startTime >= endTime) return endTime;
long count = 0;
for (long timePerPerson : timeToCheck) {
if (count > MAX_TIME * M) break;
count += mid / timePerPerson;
}
if (count < M) {
return binarySearch(mid + 1, endTime);
} else {
return binarySearch(startTime, mid);
}
}
}
- 오버플로우잡는것 때문에 오래걸렸다.
- count를 더할 때 timePerPerson이 다 1인경우 long 타입도 범위를 벗어날 수 있으므로 최대로 나올 수 있는 시간을 초과하는 경우 break 시켜야한다.