TIL
[코테연습] 2064. Minimized Maximum of Products Distributed to Any Store
크라00
2024. 11. 14. 11:29
배열 / 이진탐색 문제
문제분석
- 목표: n개의 매장에 quantities 배열에 있는 제품을 나누어 각 매장이 받는 최대 제품 수를 최소화하는 것입니다.
- 제약사항:
- 각 매장은 quantities 배열에 포함된 여러 제품 중 일부를 가져가야 하며, 모든 매장이 받는 제품 수의 최대값을 최소로 유지해야 합니다.
- 모든 quantities의 요소를 배분할 수 있을 만큼의 충분한 매장(n)이 주어진다고 가정합니다.
- 예시 이해:
- quantities = [7, 4, 5], n = 3일 때:
- 한 매장에 3개씩 분배하면 충분히 n개의 매장에 나눌 수 있습니다.
- 각 매장에 3개 이하로 분배 가능할 경우, 최대값은 3으로 최소화됩니다.
- quantities = [7, 4, 5], n = 3일 때:
문제풀이
- 이분 탐색 설정:
- 매장에 분배할 제품 수의 최소값 min을 1로, 최대값 max를 quantities 중 가장 큰 값으로 설정합니다.
- 이분 탐색 진행:
- mid = (min + max) / 2로 중간값을 계산하여, 이 값을 각 매장에 최대 배분 가능한 제품 수로 가정합니다.
- 각 quantity를 mid로 나누어 필요한 매장 수를 계산합니다.
- 필요한 매장 수 = store += (quantity + mid - 1) / mid (정수 올림 연산)
- 필요한 매장 수가 n 이하라면, max를 줄여 더 작은 최대값을 찾도록 탐색 범위를 좁힙니다.
- 필요한 매장 수가 n보다 크면 min을 늘려 더 큰 최대값을 탐색합니다.
- 최종 반환값:
- 이분 탐색이 끝날 때 min에 최적의 최대값이 저장됩니다.
> java
class Solution {
public int minimizedMaximum(int n, int[] quantities) {
int[] copiedArr = Arrays.copyOf(quantities, quantities.length);
Arrays.sort(copiedArr);
int min = 1;
int max = copiedArr[copiedArr.length-1];
while(min < max) {
int mid = (max + min) / 2;
int store = 0;
for (int i = 0; i < quantities.length; i++) {
int q = quantities[i];
// 나눈 값을 올림한 것과 동일한 효과
store += (q + mid - 1) / mid;
}
if (store > n) {
min = mid+1;
} else {
max=mid;
}
}
return min;
}
}
> python
class Solution:
def minimizedMaximum(self, n: int, quantities: List[int]) -> int:
min_val = 1
max_val = max(quantities)
while min_val < max_val :
mid = (min_val+max_val) // 2
store = 0
for q in quantities :
store += (q + mid - 1) // mid
if store > n :
min_val = mid+1
else :
max_val = mid
return min_val