수식 유도 자체는 그리 어렵지 않을 것이고, 문제 예제에 바로 수식을 활용한 풀이를 보여 주니 그대로 구현만 해 주면 되겠다.
두 번째는 이 수식을 어떻게 효율적으로 적용할지에 대한 문제가 된다. 최대 diff는 100000이고, diff의 길이는 최대 300000이므로 이걸 모두 테스트해볼 순 없는 노릇이다.
이분 탐색을 이용하면 이 시간복잡도를 O(logN)으로 줄일 수 있다. 통과할 수 있는 최소 level을 찾는 문제는 lower bound를 찾는 문제로 변한다.
def check(diffs, times, limit, level) :
prev = 0
total = 0
for d, t in zip(diffs, times) :
total += t+(t+prev)*max(0, d - level)
if total > limit :
return False
prev = t
return True
def solution(diffs, times, limit):
start, end = 1, max(diffs)
while start < end :
mid = (start+end)//2
if check(diffs, times, limit, mid):
end = mid
else :
start = mid+1
return end