이분 탐색을 사용해야 하는 문제이다.
이분 탐색이 무엇인진 알지만 코딩테스트에서는 전혀 응용하지 못하겠다..
결국 블로그를 참고하여 풀이 방법을 이해하려 노력했다.
블로그
현재시간(mid) / time[i] 를 모두 더한 값으로 현재 시간동안 몇명을 처리했는지 알 수 있다.
public long solution(int n, int[] times)
{
long answer = 0;
Array.Sort(times);
long[] t = Array.ConvertAll(times,val => (long)val);
long start = 1; // 시작 인덱스
long end = (long)n * t[0]; // 종료 인덱스 (정렬해 두었기 떄문에 가장 작은, 심사를 가장 빨리 끝낼 수 있는 t 값 * 사람 수로 시작)
answer = end; // 일단 최대 시간으로 설정
long mid = 0;
while(start <= end)
{
mid = (start + end) / 2; //중간값 (이분탐색)
long pCnt = 0;
for (int i = 0; i < t.Length; i++)
{
pCnt += mid / t[i];
}
if(pCnt < n) // 통과한 사람 수 가 답(n)보다 적은 경우
{
start = mid + 1; // 시작은 현재 중간값보다 높아야 한다! + 1
}
else
{
answer = mid; // 정답일 수 도 있다.
end = mid - 1; // 종료 값을 더 줄일 수 있다!
}
}
return answer;
}