(2분 검색) Programmer Immigration Level 3 Java

https://school.programmers.co.kr/learn/courses/30/lessons/43238

쉬운 목차

문제 설명

n 사람들이 이민을 위해 줄을 서고 있습니다.

심사에 소요되는 시간은 각 출입국심사대 심사관에 따라 다릅니다.

처음에는 모든 심판이 비어 있습니다.

심사위원 테이블에서는 한 명의 심사위원만 심사를 받을 수 있습니다.

앞에 서 있는 사람은 빈 심사대에 가서 심사를 받을 수 있습니다.

다만, 더 일찍 마감하는 심사위원이 있는 경우에는 기다렸다가 심사를 받으러 가실 수 있습니다.

우리는 모든 사람을 평가하는 데 걸리는 시간을 최소화하고자 합니다.

n을 입력하기 위해 대기하는 사람의 수가 주어졌을 때 모든 사람이 이민국을 통과하는 데 걸리는 시간의 최소값을 반환하는 솔루션 함수를 작성하고 각 검사관이 사람을 검사하는 데 필요한 시간을 배열에 곱합니다.

매개변수.

제한

  • 이민을 기다리는 사람들의 수는 1에서 1,000,000,000까지 다양합니다.

  • 각 심사관이 개인을 검사하는 데 걸리는 시간은 1분에서 1,000,000,000분 사이입니다.

  • 리뷰어의 수는 1명 이상 100,000명 이하입니다.

I/O 예시

I/O 예시

N 시간 돌려 주다
6 (7, 10) 28

설명

중간: 판단할 시간

합계: 심사위원 수

상단에 평균과 합계가 있는 두 부분으로 구성된 검색을 수행합니다.

자세한 내용은 코드 주석에 있습니다.

암호

import java.util.Arrays;
class Solution {
    public long solution(int n, int() times) {
        Arrays.sort(times);
        long answer = 0;
        long start = 0;
        long end = (long) n * times(times.length - 1);
        long sum, mid;
        while (start <= end) {
            mid = (start + end) / 2;
            sum = 0;
            for (int i = 0; i < times.length; i++) // 주어진 시간동안 몇명 심사할 수 있는지 계산
                sum += mid / times(i);
            if (n > sum){ // 심사를 다 못한경우
                start = mid + 1;
            }
            else{ //심사를 다한 경우 시간을 줄여서 다시 심사해 본다
                end = mid - 1;
                answer = mid;
            }
        }
        return answer;
    }
}