[BOJ] 16564 히오스 프로게이머
이진 탐색
해당 문제를 처음에 딱 보면 그냥 완전 탐색을 하며 연산을 하면 될 것으로 보인다. 그리고 입력의 크기를 보면 개수가 100만이다. 그리고 수의 최대 크기는 10억이다. 여기서 순차탐색을 하며 계산을 한다면 10억 * 100만이 될 것이다. 따라서 시간 초과가 발생할 것이다.
그래서 생각해 낼 수 있는 것이 10억에 대한 값을 순차탐색이 아닌 이진탐색으로 범위를 좁혀나가는 것이다.
위의 과정으로 이진 탐색 문제라는 것을 도출해 낼 수 있다. 반복문을 사용하여 이진탐색을 구현했고, 코드는 아래와 같다.
import sys
def get_level(mid):
result = 0
for x in X:
if x > mid:
continue
result += mid - x
return result
def solution(x, k):
start = 0
end = max(x)
answer = 0
while start <= end:
mid = (start + end) // 2
total_level = get_level(mid)
if total_level == k:
answer = mid
break
if total_level < k:
start = mid + 1
answer = mid
else:
end = mid - 1
return answer
if __name__ == "__main__":
N, K = map(int, sys.stdin.readline().rstrip().split())
X = list()
for _ in range(N):
X.append(int(sys.stdin.readline().rstrip()))
print(solution(X, K))