LeetCode 75: 875. Koko Eating Bananas

김준수·2024년 4월 19일
0

LeetCode 75

목록 보기
56/63
post-custom-banner

875. Koko Eating Bananas

Koko loves to eat bananas. There are n piles of bananas, the ith pile has piles[i] bananas. The guards have gone and will come back in h hours.

Koko can decide her bananas-per-hour eating speed of k. Each hour, she chooses some pile of bananas and eats k bananas from that pile. If the pile has less than k bananas, she eats all of them instead and will not eat any more bananas during this hour.

Koko likes to eat slowly but still wants to finish eating all the bananas before the guards return.

Return the minimum integer k such that she can eat all the bananas within h hours.

Example 1:

Input: piles = [3,6,7,11], h = 8
Output: 4

Example 2:

Input: piles = [30,11,23,4,20], h = 5
Output: 30

Example 3:

Input: piles = [30,11,23,4,20], h = 6
Output: 23

Constraints:

  • 1 <= piles.length <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

875. 코코의 바나나 먹기

코코는 바나나를 먹는 것을 좋아합니다. 바나나 더미가 n개 있으며, i번째 더미에는 piles[i]개의 바나나가 있습니다. 경비원들이 떠났다가 h시간 후에 돌아옵니다.

코코는 시간당 바나나 먹는 속도 k를 결정할 수 있습니다. 매 시간마다, 그녀는 바나나 더미를 하나 고르고 그 더미에서 k개의 바나나를 먹습니다. 만약 더미에 k개보다 적은 바나나가 있다면, 그녀는 그 모든 바나나를 다 먹고 그 시간 동안 더 이상 바나나를 먹지 않습니다.

코코는 천천히 먹기를 좋아하지만 경비원이 돌아오기 전에 모든 바나나를 다 먹고 싶어 합니다.

경비원이 돌아오는 시간 h시간 내에 모든 바나나를 먹을 수 있도록 최소 정수 k를 반환하세요.

예시 1:

입력: piles = [3,6,7,11], h = 8
출력: 4

예시 2:

입력: piles = [30,11,23,4,20], h = 5
출력: 30

예시 3:

입력: piles = [30,11,23,4,20], h = 6
출력: 23

제약 조건:

  • 1 <= piles.length <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

Solution

import java.util.Arrays;

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        int left = 1;
        int right = Arrays.stream(piles).max().getAsInt(); // 배열 중 최댓값을 한 번만 계산합니다.

        while (left <= right) {
            int mid = (left + right) / 2;
            long k = 0;
            for (int p : piles) {
                k += (p + mid - 1) / mid; // 올림 계산을 효율적으로 수행
            }

            if (k <= h) {
                right = mid - 1; // k가 h 이하면 k를 줄여 더 작은 속도를 탐색
            } else {
                left = mid + 1; // k가 h보다 크면 k를 늘려야 하므로 더 큰 속도를 탐색
            }
        }

        return left; // 최소 k 값 반환
    }
}
post-custom-banner

0개의 댓글