sugang
sugang'study
sugang
전체 방문자
오늘
어제
  • 분류 전체보기
    • [OS]
    • [취업정보]
    • [Server]
    • [Algorithm]
    • [Database]
    • [MyTravel]
    • [Network]

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • n

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sugang

sugang'study

[Algorithm]

완전탐색 - 여러 구간, 구간 합의 최댓값이 최소가 되도록

2023. 5. 8. 23:19
n개의 숫자가 주어지면, 숫자 사이에 칸막이를 m - 1개 두어 총 m개의 구간으로 나누려고 합니다. 이때 칸막이를 적절하게 설치하여, m개의 구간으로 나누어 졌을 때 구간 합들 중 최댓값이 최소가 되도록 하라.

 

입력 예제 

6 3 (n m) 

7 2 1 5 6 3

 

출력: 9

-> 7 2 | 1 5 | 6 3 과 같이 나누면 구간 합 중 최댓값이 9

 

100 개의 숫자를 여러 개의 구간으로 나누는 경우의 수, 숫자들을 모든 구간으로 나누어 완전 탐색 시

최악의 경우 99C50 = 약 5*(10**28) 이므로, 너무 많은 수. 

 

solution

구간의 합의 최댓값을 결정하여 그 최댓값에 맞게 구간을 나눈다. 

숫자를 순서대로 탐색하며 현재 숫자에 바로 전 숫자를 더한 값이 설정한 최댓값 보다 크면, 다음 구간으로 이동시킨다. 

만약, 숫자 하나가 설정한 최댓값보다 크면 구간을 나눌 수 없는 경우이다. 

 

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

#m개의 구간...이 아니라 구간 합의 최댓값으로 탐색
ans=10000
for i in range(1,10001):
    # possible : 구간을 나눌 수 있으면 true
    # section : 나뉘어져야 하는 구간의 개수
    possible = True
    section = 1
    
    cnt=0
    for j in range(n):
        if arr[j] > i :
            possible=False
            break
        if cnt+arr[j] > i :
            cnt=0 # 다음 구간
            section+=1
        #이번 구간에 j숫자 넣음
        cnt+=arr[j]

    if possible and section <= m:
        ans=min(ans,i)

print(ans)

 

'[Algorithm]' 카테고리의 다른 글

[탐색] 전략 추려내기 - ABC 줄세우기  (0) 2023.05.10
완전탐색 - 최대최소차  (0) 2023.05.08
[이코테] 다익스트라 알고리즘  (0) 2022.06.02
[백준] - 2839 설탕배달  (0) 2022.05.27
[백준] 9251-LCS  (0) 2022.05.25
    '[Algorithm]' 카테고리의 다른 글
    • [탐색] 전략 추려내기 - ABC 줄세우기
    • 완전탐색 - 최대최소차
    • [이코테] 다익스트라 알고리즘
    • [백준] - 2839 설탕배달
    sugang
    sugang

    티스토리툴바