Leetcode Java Find the Smallest Divisor Given a Threshold
업데이트:
문제
코드
class Solution {
public int smallestDivisor(int[] nums, int threshold) {
int left = 1;
int right = (int) 1e6;
while (left < right) {
int mid = (left + right) / 2;
int sum = 0;
for (int num : nums) {
sum += (num + mid - 1) / mid;
}
if (sum > threshold) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
}
결과
설명
- 아래 수행을 통해서 모든 배열의 값을 threshold보다 작거나 같도록 할 수 있는 가장 작은 약수를 구하는 문제이다.
- 양의 정수 약수를 선택하여 모든 배열의 값을 이 숫자로 나눈 후 다음 나눗셈 연산에 합산한다.
- 각 나눗셈의 결과는 해당 값보다 크거나 가까운 숫자로 반올림된다.
-
left와 right는 값을 탐색하기 위한 값의 범위로, 값의 하한값인 1과 상한값인 $10^6$으로 각각 초기화한다.
- left가 right보다 작을 때 까지 아래를 반복한다.
- mid에 $\frac{left + right}{2}$인 중앙값을 넣어준다.
- sum은 합계를 저장할 변수로 0으로 초기화한다.
-
nums의 모든 값을 순차적으로 num에 넣으며 sum에 $\frac{num + mid - 1}{mid}$ 값을 더해준다.
-
sum이 threshold보다 크면 left에 $mid + 1$을, 아니면 right에 mid를 넣어 범위를 축소시킨다.
- 반복이 완료되면 가능한 가장 작은 약수인 left를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기