본문 바로가기
BOJ

[BinarySearch] 기타 레슨

by YGSEO 2020. 12. 11.
728x90

출처: deok2kim.tistory.com/109

 

[python] 백준 - 2343. 기타 레슨

🤔문제 해결 S1 | 이분 탐색 이분 탐색 문제는 무엇을 탐색 할 것인지가 가장 중요합니다. 이 문제에서는 블루레이의 최소 크기 를 찾아야 합니다. 처음에 각각의 블루레이에 레슨들을 순서대로

deok2kim.tistory.com

 

# 2343 guitar lesson
def add_lesson():
    cnt = 0  # 레코드 갯수 세기
    sum_lesson = 0  # 한 레코드에 들어갈 레슨들의 합
    for i in range(N):
        if sum_lesson + lesson_list[i] > mid:
            cnt += 1
            sum_lesson = 0

        sum_lesson += lesson_list[i]
    else:
        if sum_lesson:
            cnt += 1
    return cnt


if __name__ == "__main__":
    N, M = map(int, input().split())  # N: 레슨 수, M: 블루레이 수
    lesson_list = list(map(int, input().split()))  # 레슨들

    right = sum(lesson_list)   # 레슨을 하나의 레코드에 다 담을 수 있을 때 레코드의 크기는 레슨의 합이다
    left = max(lesson_list)  # 레코드가 가질 수 있는 가장 작은 크기
    while left <= right:
        # 레코드 크기 중간값 구하기
        mid = (left + right) // 2
        cnt = add_lesson()
        if cnt <= M:  # 레코드 숫자가 모자라면 레코드 크기(mid)를 줄인다.
            right = mid - 1
        elif cnt > M:  # 레코드 숫자가 더 많아지면 레코드 크기(mid)를 늘린다
            left = mid + 1

    # 답은 left 에 있다. (최소 크기)
    print(left)
if __name__ == '__main__':
    n, m = map(int, input().split())
    lesson = list(map(int, input().split()))
    start, end = max(lesson), sum(lesson)

    while start <= end:
        mid = (start + end) // 2

        cnt = 0
        play_time = 0
        for l in lesson:
            # play_time이 m보다 커지면 새로운 dvd 필요
            if play_time + l > mid:
                cnt += 1
                play_time = 0

            play_time += l

        cnt += 1 if play_time else 0

        if cnt <= m:
            end = mid - 1
        else:
            start = mid + 1
    print(start)
728x90

'BOJ' 카테고리의 다른 글

[BinarySearch] 두 배열의 합  (0) 2020.12.11
[BinarySearch] 개똥벌레  (0) 2020.12.08
[BinarySearch] 게임 1072  (0) 2020.12.08
[BinarySearch w/LIS] 반도체설계  (0) 2020.12.06
[BinarySearch] K번째 수 1300번  (0) 2020.12.03

댓글