[프로그래머스_43238] 입국심사 Python 풀이

출처: 프로그래머스

문제

image image

풀이

이분탐색으로 풀어주었습니다.

걸리는 시간의 최솟값을 구해야할 값으로 두고 이분탐색을 합니다.

lo와 hi를 각각 가능한 최솟값과 최댓값으로 초기화해줍니다.

  • lo = 사람 수(n)와 심사관의 수(len(times))가 같고 모든 심사관이 걸리는 시간이 1분으로만 이루어져 있을 때
  • hi = 가장 오래걸리는 심사관(max(times))이 모든 사람(n)을 심사할 때

mid시간 내에 각각 심사관들이 심사할 수 있는 사람들의 수를 done에 더해줍니다.
done의 수가 n을 넘기거나 같아진다면 심사할 수 있는 충분한 시간이 되기 때문에 바로 break해줍니다.

done의 수가 더 많다면 hi의 값을 줄여 더 적은 시간범위에서,
done의 수가 모자라다면 lo의 값을 늘려 더 많은 시간범위에서 찾을 수 있게 합니다.

done의 수가 많을 때는 최소는 아니더라도 조건에 충족한 값이니 answer를 update해줍니다.

코드

def solution(n, times):
    answer = 0
    lo, hi = 1, max(times)*n
    while lo <= hi:
        mid = (lo + hi) // 2
        done = 0
        for time in times:
            done += mid // time
            if done >= n:
                break
        if done >= n:
            hi = mid - 1
            answer = mid
        else:
            lo = mid + 1
    return answer

Leave a comment