반응형

programmers.co.kr/learn/courses/30/lessons/42891

 

코딩테스트 연습 - 무지의 먹방 라이브

 

programmers.co.kr

def solution(food_times, k):
    if sum(food_times) <= k: # 모든 음식을 먹는 시간 <= 방송 중단 시간 : k초 이후 남은 음식이 없음 
        return -1
    
    def check(mid_k): # x초 걸리는 음식을 다 먹을때까지 식사하는데 걸리는 시간 반환
        return sum([mid_k if i >= mid_k else i for i in food_times])
    
    mn, mx = 0, max(food_times) # 식탁에 있는 음식의 최소 소요시간, 최대 소요시간 
    while mn < mx - 1: # 이분탐색
        mid = (mx + mn) // 2
        if k < check(mid): # mid초 걸리는 음식을 다 먹었을때 k를 초과하면 max 조정
            mx = mid 
        else: # mid초 걸리는 음식을 다 먹었는데 k가 남아 있으면 min 조정
            mn = mid
    
    k -= check(mn) # k에서 check(이분탐색 결과)를 빼줌.
    return [i + 1 for i, t in enumerate(food_times) if t > mn][k] # 남은 음식중 k번째 음식 번호

→ 이분탐색 min 초기값을 0으로 한 이유는 [1,1,1], k = 2 와 같은 경우를

이분탐색 이후 처리할 필요가 없도록 한 것. 

 

이분탐색에서 빠져 나온뒤 max는 고려할 필요 x

(if k < check(mid) 의 경우에만 max = mid이므로.)

 

징검다리 건너기 문제와 비슷한듯.

반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

문자열 압축  (0) 2021.02.23
블록 게임  (0) 2021.02.23
매칭 점수  (0) 2021.02.21
길 찾기 게임  (0) 2021.02.21
후보키  (0) 2021.02.19

+ Recent posts