Algorithm(CodeTree, Python)/완전탐색3

[코드트리 기준을 새로 설정하여 완전탐색] 구간 잘 나누기 Python

kurooru 2023. 1. 8. 13:04

처음으로 답지보고 풀었다.

최소의 최대, 최소의 최대 이런 문제 풀 때는

반드시 그 범위를 설정하고 하나씩 가능한 값인지 생각하는 아이디어를 기억해야겠다.

# n, m 입력
n, m = map(int, input().split())
# num_list
num_list = list(map(int, input().split()))

# 함수들
# is_possible(curr_possible_max)
def is_possible(curr_possible_max):
    
    # curr_sum
    curr_sum = 0
    # curr_section
    curr_section = 1

    for i in range(n):
        
        # 하나라도 숫자가 curr_possible_max보다 크면
        if num_list[i] > curr_possible_max:
            # 실패
            return False
        
        # 이번 숫자가 들어갔을때 curr_possible_max보다 크면
        if curr_sum + num_list[i] > curr_possible_max:
            # curr_sum 초기화
            curr_sum = 0
            # 섹션 수 추가
            curr_section += 1
        
        # 이번 숫자 넣어주기
        curr_sum += num_list[i]
    
    # 최종적으로 나눈 섹션 수가 m보다 작거나 같으면
    if curr_section <= m:
        # 성공
        return True

# 설계
# min_range, max_range (최댓값이 될 수 있는 최솟값과 최댓값)
min_range, max_range = 1, sum(num_list)

# 최댓값이 될 수 있는 범위 내에서 탐색
for possible_max in range(min_range, max_range + 1):
    # 최댓값이 될 수 있으면
    if is_possible(possible_max):
        # 출력
        print(possible_max)
        # 반복문 종료
        break