본문 바로가기
정리/알고리즘

이분탐색 - 입국심사

by Hudini30 2022. 3. 14.

프로그래머스(이분탐색) - 입국심사

해당 문제는 이분탐색을 이용해 풀면 되는 문제입니다. 문제를 처음 봤을때 생각했던 방식은 우선순위를 통한 풀이입니다. 우선순위의 기준은 각 time + finishTime 으로 했었고, 반복할때마다 큐에서 꺼내고 finishTime 을 업데이트 하여 다시 넣어주는 방식을 생각했습니다. 시간초과가 날 것으로 예상되었지만, 시도해 보았고, 결과 역시 예상대로 시간초과가 되었습니다.

public long solution1(int n, int[] times) {
        long answer = 0;
        PriorityQueue<ImmigrationInformation> priorityQueue = new PriorityQueue<>((o1, o2) -> o1.finishTime + o1.time > o2.finishTime + o2.time ? 1 : -1);

        for(int time : times) {
            priorityQueue.add(new ImmigrationInformation(time, 0));
        }

        for (int i = 0; i < n; i++) {
            ImmigrationInformation information = priorityQueue.poll();
            answer = information.time + information.finishTime;
            information.finishTime = answer;
            priorityQueue.add(information);
        }

        return answer;
    }

    class ImmigrationInformation {
        long time;
        long finishTime;
        ImmigrationInformation(long time, long finishTime) {
            this.time = time;
            this.finishTime = finishTime;
        }
    }

이분탐색 알고리즘 문제라는 힌트를 몰랐다면, 생각하기 쉽지 않았을것으로 생각됩니다. 이 후 풀이는 다른 분들의 풀이와 유사하게 풀었습니다.

public long solution(int n, int[] times) {
        long answer = 0;
        Arrays.sort(times);

        long minTime = 1;
        long maxTime = (long)times[times.length - 1] * (long)n;

        while (minTime <= maxTime) {
            long midTime = (minTime + maxTime) / 2;
            long people = 0;
            for (int time : times) {
                people += midTime / time;
                if (people >= n) {
                    break;
                }
            }
            if (people >= n) {
                answer = midTime;
                maxTime = midTime - 1;
            } else {
                minTime = midTime + 1;
            }
        }

        return answer;
    }

'정리 > 알고리즘' 카테고리의 다른 글

이분탐색 - 징검다리  (0) 2022.03.16
DFS - 네트워크  (0) 2022.03.15
DFS - 여행경로  (0) 2022.03.11
DFS/BFS - 타겟 넘버  (0) 2022.03.10
DP - 도둑질  (0) 2022.03.09

댓글