N
: 막걸리 주전자 개수
K
: 친구들의 수
주전자의 개수가 사람 수보다 많을 수는 없다.
분배할 수 있는 막걸리의 최댓값을 구하는 문제이다.
⭐️ 막걸리 분배 방법
- K명에게 똑같은 양의 막걸리 분배
- 다른 주전자의 막걸리 섞이면 ❌
- K명에게 최대한 많은 양의 막걸리 분배해야 함
변수의 범위가 매우 크기 때문에 시간 복잡도를 줄일 수 있는 방법을 사용해야 할 것이다.
→ 이분 탐색을 활용한다!
이분 탐색을 통해 막걸리 양을 적절히 조절하면서 모든 사람에게 동일한 양을 나눠줄 수 있는 최댓값을 구한다.
이분 탐색 구현
1
~ 용량 최댓값
사이로 지정한다.범위의 중앙값 ﹦ 분배할 막걸리 양
를 의미하므로 분배 조건에 맞는지 확인한다.주전자 입력 →
이분탐색 내에서 사람 수 계산 →
최종 시간복잡도
이 되어 최악의 경우 으로 1초 내 연산 가능하다.
이분탐색으로 적절한 막걸리 용량 찾기
# 주전자 용량 입력
pots = list(map(int, input().split()))
런타임 에러 (ZeroDivisionError)
가 발생했다. 이는 0을 나눌 때 발생하게 된다.import sys
input = sys.stdin.readline
# N, K 입력
N, K = map(int, input().split())
# 주전자 용량 입력
pots = [int(input()) for _ in range(N)]
# 이분탐색 범위 지정
start = 1
end = max(pots)
# 결과 저장 변수
answer = 0
# 이분탐색 진행
while start <= end:
# 중앙값 지정
mid = (start + end) // 2
# 나눠줄 수 있는 사람 수 계산
count = 0
for pot in pots:
count += pot // mid
# 나눠줄 수 있는지 여부 확인
if count >= K:
# 가능하니까 저장 후 범위 늘리기
answer = mid
start = mid + 1
else:
# 불가능하니까 범위 좁히기
end = mid - 1
# 결과 출력
print(answer)