전체 회차
A-030Day 302026.06.05mediumleetcode #875neetcode150

코코의 바나나 먹기

#array#binary-search
leetcode #875 · koko-eating-bananas
01

문제

· problem
P.030

코코의 바나나 먹기

leetcode #875

코코는 바나나를 먹는 것을 좋아합니다. n개의 바나나 더미가 있으며, i번째 더미에는 piles[i]개의 바나나가 있습니다. 경비원들이 가서 h시간 후에 돌아올 예정입니다. 코코는 시간당 바나나 먹는 속도 k를 정할 수 있습니다. 매 시간마다, 그녀는 어떤 바나나 더미를 선택하고 그 더미에서 k개의 바나나를 먹습니다. 만약 더미에 k개보다 적은 바나나가 있다면, 모두 먹고 그 시간 동안 더 이상의 바나나를 먹지 않습니다. 코코는 천천히 먹고 싶지만, 경비원이 돌아오기 전에 모든 바나나를 먹어야 합니다. 코코가 h시간 내에 모든 바나나를 먹을 수 있는 최소 정수 k를 반환하세요.

제약
  • · 1 ≤ piles.length ≤ 10⁴
  • · piles.length ≤ h ≤ 10⁹
  • · 1 ≤ piles[i] ≤ 10⁹
// 지문은 본인 언어 요약 — 원문은 위 링크에서
입출력 예시
example 1input → output
[3,6,7,11]
8
4
example 2input → output
[30,11,23,4,20]
5
30
example 3input → output
[30,11,23,4,20]
6
23
02

사전 사고

· pre-solve
● 1리스트 출력● 2선택● 3정답 공개
  • 코코는 한 시간에 여러 더미에서 먹을 수 있나요?
  • 코코의 먹는 속도 k는 시간에 따라 변할 수 있나요?
  • k는 정수여야 하나요?
  • 어떤 더미에서 시작하든 모두 시간이 같나요?
  • k가 max(piles)보다 작으면 반드시 모든 바나나를 먹을 수 없나요?
던질 질문에 체크하고 확인을 누르세요
// 결과는 세션 메모리만 — 새로고침하면 초기화됩니다 (반복 학습)
03

논리 구조

· logic
● 1슬롯 출력● 2슬롯별 선택● 3정답 공개
// 각 슬롯에 들어갈 코드 한 줄을 골라 알고리즘 흐름을 합성해보세요. 코드는 안 짜지만 논리 뼈대는 직접.
step 1· 이진 탐색 범위 초기화
l, r = 1, max(piles)
l, r = 0, sum(piles)
l, r = 1, len(piles)
step 2· 최대 속도로 초기 결과 설정
res = r
res = l
res = -1
step 3· 탐색 범위가 존재하는 동안 반복
while l <= r:
while l < r:
while l <= r - 1:
step 4· 중간 후보 속도 계산중첩
k = (l + r) // 2
k = (l + r) / 2
k = r - (r - l) // 2
step 5· 속도 k로 필요한 총 시간 계산│ │ 중첩
totalTime += math.ceil(float(p) / k)
totalTime += p // k
totalTime += p / k
step 6· 속도가 실행 가능할 때 우측 범위 업데이트│ │ 중첩
r = k - 1
l = k + 1
r = k
step 7· 속도가 불충분할 때 좌측 범위 업데이트│ │ 중첩
l = k + 1
r = k - 1
l = k
각 슬롯에 한 줄씩 골라보세요
// format: slot — 다른 패턴(재귀·DP 등) 은 ordering·state-first 등 별도 format. ADR-08 후속.
04

문제풀이 · 트레이스

· solve
solution.py
1
class Solution:
2
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
3
        l, r = 1, max(piles)
4
        res = r
5
6
        while l <= r:
7
            k = (l + r) // 2
8
9
            totalTime = 0
10
            for p in piles:
11
                totalTime += math.ceil(float(p) / k)
12
            if totalTime <= h:
13
                res = k
14
                r = k - 1
15
            else:
16
                l = k + 1
17
        return res
머릿속 dry-run 케이스
// 각 케이스를 머릿속으로 따라가보세요. 막히면 아래 worked example 펼침.
case 1
[3,6,7,11]
8
4
case 2
[30,11,23,4,20]
5
30
case 3
[30,11,23,4,20]
6
23
// UI 가 walk-through 안 함 — 학습자가 머릿속으로. 막히면 worked example 펼침.