[백준 3079] 입국심사(Java)

최민길(Gale)·2023년 11월 30일
1

알고리즘

목록 보기
158/172

문제 링크 : https://www.acmicpc.net/problem/3079

이 문제는 이분 탐색을 이용하여 풀 수 있습니다. 이 문제의 가장 어려운 부분은 문제에서 어떻게 이분 탐색을 적용하느냐입니다. 이는 시간을 기준으로 탐색하여 주어진 시간 내에 모든 사람이 탐색이 가능하다면 시간값을 줄이고, 탐색이 불가능하다면 시간값을 늘리는 방식으로 진행합니다. 이 때 시간값이 크기 때문에 이분 탐색으로 탐색 시간을 줄입니다. 시간 체크의 경우 배열의 각 값들로 시간을 나눴을 경우 그 값들의 합이 총 인원 수보다 작다면 가능, 그렇지 않으면 불가능합니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        long M = Long.parseLong(st.nextToken());
        long res = Long.MAX_VALUE;

        long[] arr = new long[N];
        long max = 0;
        for(int i=0;i<N;i++){
            arr[i] = Long.parseLong(br.readLine());
            max = Math.max(max, arr[i]);
        }
        Arrays.sort(arr);

        long start = 0;
        long end = max*M;
        while(start <= end){
            long mid = (start+end)/2;
            long sum = 0;
            for(int i=0;i<N;i++){
                long cnt = mid/arr[i];

                if(sum >= M) break;
                sum += cnt;
            }

            if(sum>=M){
                end = mid-1;
                res = Math.min(res, mid);
            }
            else start = mid+1;
        }

        System.out.println(res);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글