문제 링크
https://www.acmicpc.net/problem/17179
풀이
다음과 같이 접근하여 문제를 해결하였다.
1. 케이크를 Q_i 자를 때 생기는 가장 작은 조각의 최댓값의 최적해를 X라고 가정한다.
2. 실제로 케이크를 Q_i번 잘랐을 때 X가 가능한 해인지 확인한다.
3. 가능하다면 X보다 큰 X + k를 새로운 최적해로 가정한다. 불가능하다면 X보다 작은 X - k를 새로운 최적해로 가정한다.
4. 1~3의 과정을 이분 탐색으로 진행한다.
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] line = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int n = line[0];
int m = line[1];
int l = line[2];
int[] spots = new int[m+1];
int last = 0;
for (int i = 0; i < m; i ++) {
int spot = Integer.parseInt(br.readLine());
spots[i] = spot - last;
last = spot;
}
spots[m] = l - last;
for (int i = 0; i < n; i ++) {
int q = Integer.parseInt(br.readLine());
int left = 1;
int right = l;
int ans = 0;
while (left <= right) {
int mid = (left + right) / 2;
// 최적해가 mid일 때를 가정
// mid 이상의 조각이 q + 1개 나와야한다.
// 가능하다면 갱신해주고 더 큰 범위를 탐색
if (isPossible(spots, mid, q)) {
ans = Math.max(ans, mid);
left = mid + 1;
} else { // 불가능하다면 더 작은 범위를 탐색
right = mid - 1;
}
}
System.out.println(ans);
}
}
public static boolean isPossible(int[] spots, int x, int q) {
// x 이상의 조각이 (q + 1)개 나오는지 반환
int sliceCnt = 0;
int partialSum = 0;
for (int i=0; i<spots.length; i++) {
partialSum += spots[i];
if (partialSum >= x) {
sliceCnt += 1;
partialSum = 0;
}
}
return sliceCnt >= q + 1;
}
}
'Koala - 14기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/c++] 1455번: 뒤집기 || (0) | 2024.04.08 |
---|---|
백준 30088번 공포의 면담실 C++ (0) | 2024.04.08 |
[백준 / c++] 15685 드래곤커브 (0) | 2024.04.07 |
[백준/python] IF문 좀 대신 써줘 (0) | 2024.04.07 |
[백준/python3] 2243번 : 사탕상자 (0) | 2024.04.07 |