새소식

코테 준비/Java

[백준] #3079. 입국심사 (골드 5)

  • -

https://www.acmicpc.net/problem/3079

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int n = Integer.parseInt(st.nextToken());  //입국심사대 수
		int m = Integer.parseInt(st.nextToken());  //사람 수
		int[] time = new int[n];  //입국심사대마다의 심사시간

		for (int i = 0; i < n; i++) {
			time[i] = Integer.parseInt(br.readLine());
		}

		Arrays.sort(time);

		long low = time[0];
		long high = (long) time[n-1] * m;
		long minTime = 0;

		while (low <= high) {
			long mid = (low+high) / 2;
			long num = 0;  //사람 수
			for (long t : time) {
				num += mid / t;
				if(num >= m) break; // 통과해야되는 인원을 채웠으면 그만 추가하고 탈출
			}


			if (num >= m) {
				minTime = mid;
				high = mid - 1;
			}  else {
				low = mid + 1;
			}
		}
		System.out.println(minTime);

	}
}

 

주의할 점

1. 사람 수 num은 int가 아니라 long이어야 함

심사를 하는데 걸리는 시간인 Tk의 범위 : 1 ≤ Tk ≤ 10^9 이므로 num은 int의 범위를 넘을 수 있기 때문

2. if(num >= m) break; // 통과해야되는 인원을 채웠으면 그만 추가하고 탈출

위를 추가하여 num>=m일 때 반복문을 빠져나가 쓸데없이 연산을 계속 수행하는 것을 막아 오버플로우 막음

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.