입국심사 이분탐색

lim1313·2021년 9월 4일
0

입국심사

문제 설명

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
심사관은 1명 이상 100,000명 이하입니다.


문제해결

ex) 6명, [7, 10]

이분탐색으로 접근해야한다.

  1. 이분탐색의 전제는 요소들이 순서대로 정렬되어 있어야 하기 때문에, sort()를 사용하여 배열을 정렬시켜준다.

  2. 최소시간과 최대시간을 구하고 시간을 절반씩 줄여나간다.

  3. 최소, 최대시간의 절반시간을 구하면 중간값 30분이 된다. 30분인 경우 심사시간이 7분이 걸리는 심사관은 4명을, 10분이 걸리는 심사관은 3명을 진행할 수 있다.

  4. 총 합 7명을 처리할 수 있기 때문에, 6명을 처리하기 위한 시간은 30분보다 적은 시간이 걸린다는 것을 알 수 있다.

  5. 때분에, 최댓값 - 1을 해주면, 최소값 1, 최대값은 29가 되고, 1과 29 절반인 14분이 다음 중간값이 되고 위의 과정을 다시 거치게 된다.

  6. 만약 6명보다 적은 사람을 심사하는 경우에는 더 많은 시간이 필요하기 때문에, 최소값 + 1을 해주어 위의 과정을 진행한다.


이러한 이분탐색은 앞으로 알고리즘 문제를 풀 때 많이 사용될 것 같다.

다시 한번 풀어볼 예정이기 때문에, 해답코드는 남기지 않겠다.


프로그래머스 이분탐색 입국심사
프로그래머스 이분탐색 징검다리

profile
start coding

0개의 댓글