import sys def input(): return sys.stdin.readline().rstrip() def make_group(limit): temp = 0 cnt = 0 result = [] group_cnt = K for ind in range(N): temp += arr[ind] if temp>limit: temp = arr[ind] result.append(cnt) group_cnt -= 1 cnt = 0 cnt += 1 if group_cnt == (N-ind): result.append(cnt) group_cnt -= 1 while group_cnt: result.append(1) group_cnt -= 1 return result def count_group(val): k = 0 temp = 0 for ind in range(N): temp += arr[ind] if temp>val: temp = arr[ind] k += 1 if temp: k += 1 return k N,K = map(int,input().split()) arr = list(map(int,input().split())) left = max(arr)-1 right = sum(arr) answer = right while left+1<right: mid = (left+right)//2 K_mid = count_group(mid) if K_mid > K: left = mid else: right = mid print(right) print(*make_group(right))
최근 풀었던 문제들 중에서 가장 어렵게 푼 문제였다.
이 문제는 단순한 이분탐색으로 끝나는 것이 아닌, 그룹을 구하는게 힘들었다.
그룹을 만드는 방식은 다음과 같다.
문제에 주어진 M개의 그룹을 강제적으로 만들어줘야한다.
즉 우리가 그룹을 만들어야하는 개수와 현재 남은 구슬의 수가 동일하다면,
나머지 구슬들을 전부 1개씩으로 만들어줘야한다.
이 점을 주의해서 풀어주면 문제를 해결할 수 있는 문제였다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 11437 LCA (0) | 2021.07.31 |
---|---|
[BOJ/백준] 3687 성냥개비 (0) | 2021.07.31 |
[BOJ/백준] 2307 도로검문 (0) | 2021.07.31 |
[BOJ/백준] 2211 네트워크 복구 (0) | 2021.07.31 |
[BOJ/백준] 1944 복제 로봇 (0) | 2021.07.31 |