Problem Solving/BOJ(백준)

[BOJ]백준 3079번: 입국심사(Python)/BinarySearch

이진2 2021. 8. 26. 14:54

https://www.acmicpc.net/problem/3079

 

3079번: 입국심사

첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ 1,000,000,000) 다음 N개 줄에는 각 심사대에서 심사를 하는데 걸리는 시간인 Tk가 주어진다. (1 ≤ Tk ≤ 109)

www.acmicpc.net

오랜만에 다시 푼 이진탐색 문제 입국심사

loop invariant에 대해 알고난 뒤에는 탐색 범위 설정에 유의하고 나니 설계도 더 명확하게 되고 잘 풀리는 느낌이다

대부분의 이진탐색에서 공통적으로 적용되는 조건인 left < right를 제외하면,

이 문제에서는 left일 때에는 모든 사람이 통과하는 것이 불가능하고 right일 때 에는 모든 사람이 통과하는 것이 가능해야 한다.

따라서 mid 값을 두어 해당 값일 때 모든 심사대에서 통과할 수 있는 사람 수를 카운트하고, 가능/불가능 여부로 다음 탐탐색 범위를 결정한다.

import sys

sys.stdin=open('python/input.txt','r')
input=sys.stdin.readline

n,m=map(int,input().split())
t=[]

for _ in range(n):
  t.append(int(input()))

left=0
right=10**19
while left+1<right:
  mid=(left+right)//2
  cnt=0

  for time in t:
    cnt+=mid//time

  if cnt>=m:
    right=mid
  else:
    left=mid
print(right)