
이분 탐색 알고리즘
def binaray_search(array, target, start, end):
while start <= end:
mid = (start+end) // 2
## 찾은 경우 중간점 인덱스 반환
if array[mid]==target:
return mid
## 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
elif array[mid] > target:
end = mid - 1
## 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
else:
start = mid + 1
문제에 이분 탐색 알고리즘 적용하기
def solution(n, times):
answer = 0
## 이분 탐색의 범위가 시간 리스트
## 최솟값은 1분, 최댓값은 가장 오래 걸리는 심사위원에게 n명이 모두 심사받는 시간
## 우리는 이 리스트를 탐색하면서 최적의 시간을 확인할 것
time_list = [i for i in range(1, max(times)*n+1)]
left = 0 ## 최솟값의 인덱스
right = len(time_list) - 1 ## 최댓값의 인덱스
while left <= right :
## 시간 리스트 중 중간 값을 임의로 잡자
mid = (right+left) // 2
current_time = time_list[mid]
## 현재 시간 안에서 심사를 받을 수 있는 인원
people = 0 ## 심사 받은 사람의 수
for time in times:
people += current_time // time
## 심사 받은 사람의 수가 n 명보다 크다면 break
if people >= n :
break
## 심사 받은 인원이 n명과 일치하면, 현재가 최적의 값이기 때문에 반환하기
if people == n:
answer = current_time
break
## 심사 받은 인원이 n명보다 크면, 시간이 충분하다는 의미이므로 더 작은 시간이 가능한지 확인해보기
elif people > n:
right = mid - 1
## 심사 받은 인원이 n명보다 작다면, 시간이 부족하다는 의미이므로 더 많은 시간이 필요한지 확인해보기
elif people < n :
left = mid + 1
return answer
def solution(n, times):
answer = 0
## 이분 탐색의 범위가 시간 리스트
## 최솟값은 1분, 최댓값은 가장 오래 걸리는 심사위원에게 n명이 모두 심사받는 시간
left = 1 ## 입국 심사에서 걸리는 최소의 시간
right = max(times)*n ## 입국 심사에서 걸리는 최대의 시간
while left <= right :
## 중간값을 임의로 잡는다고 할 때
mid = (right+left) // 2
## 현재 시간 안에서 심사를 받을 수 있는 인원
people = 0 ## 심사 받은 사람의 수
for time in times:
people += mid // time
## 심사 받은 사람의 수가 n 명보다 크다면 break
if people >= n :
break
## 심사 받은 인원이 n명과 일치하면, 현재가 최적의 값이기 때문에 반환하기
if people == n:
answer = mid
break
## 심사 받은 인원이 n명보다 크면, 시간이 충분하다는 의미이므로 더 작은 시간이 가능한지 확인해보기
elif people > n:
right = mid - 1
## 심사 받은 인원이 n명보다 작다면, 시간이 부족하다는 의미이므로 더 많은 시간이 필요한지 확인해보기
elif people < n :
left = mid + 1
return answer
def solution(n, times):
answer = 0
## 이분 탐색의 범위가 시간 리스트
## 최솟값은 1분, 최댓값은 가장 오래 걸리는 심사위원에게 n명이 모두 심사받는 시간
left = 1 ## 입국 심사에서 걸리는 최소의 시간
right = max(times)*n ## 입국 심사에서 걸리는 최대의 시간
while left <= right :
## 중간값을 임의로 잡는다고 할 때
mid = (right+left) // 2
## 현재 시간 안에서 심사를 받을 수 있는 인원
people = 0 ## 심사 받은 사람의 수
for time in times:
people += mid // time
## 심사 받은 사람의 수가 n 명보다 크다면 break
if people >= n :
break
## 심사 받은 인원이 n명보다 같거나 크면, 시간이 충분하다는 의미이므로 더 작은 시간이 가능한지 확인해보기
## 현재 값이 최적일 수 있으므로 answer = mid로 넣어주기
if people >= n:
answer = mid
right = mid - 1
## 심사 받은 인원이 n명보다 작다면, 시간이 부족하다는 의미이므로 더 많은 시간이 필요한지 확인해보기
elif people < n :
left = mid + 1
return answer