이분 탐색 - 6236번: 용돈 관리

jisu_log·2025년 8월 8일

알고리즘 문제풀이

목록 보기
71/105




n, m = map(int, input().split())

days = []


for _ in range(n):
    line = int(input())

    days.append(line)


'''
m번 이하로 통장에서 돈 뺄 수 있음
뺄 때 k원씩 뺄 수 있음
돈 부족해지면 다시 인출해서 k원으로 리셋됨

1) max <= k <= 10000
2) cnt <= m

k의 cnt가 m보다 크면 오른쪽 선택
k의 cnt가 m보다 작으면 왼쪽 선택
'''

def binary_search():
    k_min = max(days) # k는 최소 days의 최대값보다 같거나 커야함
    k_max = sum(days) # 최악의 경우 모든 날짜의 금액을 한번에 뽑는 경우

    answer = k_max

    while k_min <= k_max: # 종료 조건 설정해주기
        k = (k_min + k_max) // 2 # 현재 범위의 중간값 사용, 소수점 버리기

        cnt = 1
        money = k

        for i in range(n):
            if money - days[i] < 0:
                cnt += 1
                money = k - days[i] # 돈 충전하고 쓰는것까지 잊지않기!
            else:
                money -= days[i]

        if cnt > m: # 현재 범위의 오른쪽만 사용
            k_min = k + 1      

        else: # 현재 범위의 왼쪽만 사용
            answer = k # cnt가 m보다 작거나 같다면, 현재 k는 답이 될 수 있으므로 저장
            k_max = k - 1
            
    return answer

print(binary_search())

0개의 댓글