📘 문제 정보
https://www.acmicpc.net/problem/3079
📝 문제 해석
- 입국심사대가 여러 개 있으며, 각 심사대는 한 명의 사람을 처리하는 데 걸리는 시간이 서로 다르다.
총 M명의 사람이 심사를 받기 위해 줄을 서 있으며, 각 사람은 빈 심사대에 들어가게 된다.- 사람 수 M: 최대 1,000,000,000명
- 심사대 수 N: 최대 100,000개
- 각 심사대 시간 T: 최대 1,000,000,000
💡 풀이 아이디어
🔑 핵심 접근: 이분 탐색 대상은 '시간'
- 최소 시간 start = 0, 최대 시간 end = 10^18로 설정 (심사 시간 최대가 10^9, 사람 수도 10^9라서 최대는 10^9 * 10^9 = 10^18까지 가능)
- 이분 탐색의 mid 시간에 대해
- 각 심사대가 그 시간 동안 몇 명을 처리할 수 있는지 계산
- 총 인원 수가 목표 m명 이상이면 시간 줄이고
- 부족하면 시간 늘리는 방식으로 이분 탐색 수행
✅ 핵심 전략
- start = 0, end = 10^18, answer = INF
- 이분 탐색 진행
- mid 시간 동안 심사 가능한 총 인원 계산
- count >= m이면 answer 갱신 후 end = mid - 1
- 아니면 start = mid + 1
- 최종적으로 answer에 가장 빠르게 모든 사람을 심사할 수 있는 최소 시간이 저장됨
# pypy3
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
arr = [int(input()) for _ in range(n)]
INF = 10**18
start, end = 0, INF
answer = INF
while start <= end:
mid = (start+end)//2
count = 0
for i in range(len(arr)):
count += mid//arr[i]
if count >= m:
end = mid-1
answer = min(answer, mid)
else:
start = mid+1
print(answer)
'알고리즘' 카테고리의 다른 글
| [백준 11967] 불켜기 Python (3) | 2025.08.24 |
|---|---|
| [백준 2170] 선 긋기 Python (2) | 2025.08.17 |
| [백준 1707] 이분 그래프 Python (0) | 2025.08.16 |
| [백준 14921] 용액 합성하기 Python (2) | 2025.07.27 |
| [백준 2631] 줄세우기 Python (1) | 2025.07.17 |