https://www.acmicpc.net/problem/17951
풀이 과정
- 그룹의 맞은 문제의 합의 최솟값을 기준으로 이분탐색을 진행한다.
- 초기 left를 1, right를 10**5 * 20 + 1로 둔다. 이유는 최소 점수는 1점이고 최대 점수는 그룹이 1개이면서 시험지의 개수가 10**5개이며 각 시험지에서 맞은 문제가 모두 20개일 수 있기 때문이다.
- 중간값((left + right) // 2)에 대해서 몇개의 그룹이 나오는지 확인한다.
- 맞은 개수를 더해가면서 중간값보다 커진다면 그룹의 개수를 하나 늘려주고 맞은 개수 초기화
- 전체 그룹의 개수가 K개보다 많다면 해당 점수로 나눌 수 있는 것이므로 따로 저장 후 오른쪽 구간 진행
- 전체 그룹의 개수가 K개보다 적다면 해당 점수로 나눌 수 없는 것이므로 왼쪽 구간 진행
- 따로 저장해둔 정답을 출력시켜 준다.
소스 코드
import sys
input = lambda: sys.stdin.readline().rstrip()
N, K = map(int, input().split())
paper = list(map(int, input().split()))
left = 1
right = (10 ** 5 * 20) + 1
answer = 0
while left <= right:
mid = (left + right) // 2
group_count = 0
score = 0
for p in paper:
score += p
if score >= mid:
group_count += 1
score = 0
if group_count < K:
right = mid - 1
else:
answer = mid
left = mid + 1
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 17352 ] [ Union-Find ] 여러분의 다리가 되어 드리겠습니다 (0) | 2022.01.03 |
---|---|
[ 9440 ] [ Greedy ] 숫자 더하기 (0) | 2022.01.01 |
[ 23843 ] [ Greedy ] 콘센트 (0) | 2021.12.29 |
[ 21276 ] [ 위상 정렬 ] 계보 복원가 호석 (0) | 2021.12.28 |
[ 1766 ] [ 위상 정렬 ] 문제집 (0) | 2021.12.27 |