문제 설명
문제 풀이
- 이분 탐색을 사용하였다.
- 0~10만까지 범위의 level 내에서 각 level이 valid한지를 판별하는 함수를 통해 이분탐색을 진행하면 풀이가 가능하다.
소스 코드 (JAVA)
class Solution {
long L;
int[] D, T;
int N;
public boolean isValid(int level) {
long sum = 0L;
for (int i = 0; i < N; i++) {
int diff = D[i] - level;
sum += (long)T[i];
if (diff > 0) {
long tmpSum = 0L;
tmpSum += (T[i] * diff);
if (i != 0) tmpSum += (T[i-1] * diff);
sum += tmpSum;
}
}
if (sum > L) return false;
else return true;
}
public int solution(int[] diffs, int[] times, long limit) {
D = diffs;
T = times;
L = limit;
N = diffs.length;
int lo = 0;
int hi = 100001;
while(lo + 1 < hi) {
int mid = (lo + hi) / 2;
if (isValid(mid)) hi = mid;
else lo = mid;
}
return hi;
}
}