본문 바로가기

Programmers/Level3

입국심사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;
class Solution {
    public long solution(int n, int[] times) {
        long answer = 0;
        Arrays.sort(times);
 
        long left = 0;
        long right = (long) n * times[times.length - 1]; // 최대로 걸리는 시간
 
        while (left <= right) {
            long mid = (left + right) / 2;
            long sum = 0;
 
            // mid 만큼의 시간동안 심사할 수 있는 사람의 수 계산
            for (int i = 0; i < times.length; i++) {
                sum += mid / times[i];
                if (sum >= n)
                    break;
            }
 
            if (sum < n) // 심사를 다 하지 못한 경우
                left = mid + 1;
            else // 심사를 다 한 경우
                right = mid - 1;
        }
        // 최소 시간은 left에 저장
        answer = left;
        return answer;
    }
}
cs

문제의 카테고리가 이진 탐색임에도 불구하고 어떻게 할지 감이 잡히지 않았다.

0초부터 시작하여 n을 감소시키며 계산하여 최소 시간을 찾으려고 했지만 잘 되지 않았다.

이진 탐색을 통해 최대로 걸리는 시간부터 범위를 줄여나가는 방법으로 해결하였다.

 

해결 방법은 다음과 같다.

1. left와 right를 통해 mid를 정한다.

2. 해당 mid 시간에 처리할 수 있는 사람의 수를 구한다.

3. n 이상일 경우 right를 낮추고, n 미만일 경우 left를 높인다.

4. 최종적으로 얻어낸 최소 시간은 left에 저장된다.

 

참고 사이트 : https://youngest-programming.tistory.com/499

'Programmers > Level3' 카테고리의 다른 글

순위  (0) 2021.08.12
[1차] 셔틀버스  (0) 2021.08.12
이중우선순위큐  (0) 2021.08.10
정수 삼각형  (0) 2021.08.09
단어 변환  (0) 2021.08.08