https://www.acmicpc.net/problem/16564
코드
n, k = map(int, input().split())
x = [int(input()) for _ in range(n)]
s, e = 1, int(1e9)+1
ans = 0
while s <= e:
mid = (s+e)//2
# 목표레벨 mid로 잡으면 달성 가능한지?
need_level = 0
for i in range(n):
if x[i] < mid:
need_level += mid-x[i]
if need_level <= k:
s = mid+1
ans = mid
else:
e = mid-1
print(ans)
기본적인 매개 변수 탐색 방법으로 풀 수 있다.
다만, 조심해야 할 것은 초기 s와 e 값이다. 처음에는 e의 초기값을 int(1e9)으로 두고 했더니 틀렸었다. 다시 보니 이렇게 하면 가능한 팀 최대 레벨이 1,000,000,000인 경우를 구할 수 없기 때문이었다.
s = 1, e = 10이라고 두고 가능한 팀 최대 레벨이 10이 되는 것을 구하는 경우를 생각해보니 mid=10이 되기 전에 s=10, e=10이 되어서 while문을 빠져나오기 때문에 mid=10일 때 가능한지 여부를 알 수 없게 되어서 ans는 절대 10이 될 수 없었다.
이제까지 이분 탐색에서 탐색 범위의 경계값도 포함된다고 생각했는데, 아니었다. 앞으로는 경계값이 포함될 수 있는 경우를 고려하여 범위를 설정하도록 해야 겠다.
'문제풀이 > 이분탐색' 카테고리의 다른 글
[Python/파이썬] 백준 13397번 구간 나누기 2 (0) | 2025.02.18 |
---|---|
[Python/파이썬] 백준 17393번 다이나믹 롤러 (0) | 2025.01.25 |
[Python/파이썬] 백준 16401번 과자 나눠주기 (1) | 2024.06.05 |
[Python/파이썬] 백준 6236번 용돈 관리 (0) | 2024.05.25 |
[Python/파이썬] 백준 15823번 카드 팩 구매하기 (0) | 2024.05.09 |