알고리즘 관련/BOJ
22254 공정 컨설턴트 호석
Andrew-Yun
2022. 1. 6. 11:59
https://www.acmicpc.net/problem/22254
22254번: 공정 컨설턴트 호석
거듭된 창업 성공을 이룬 류진국 사장은 이번에는 맞춤형 선물을 제작해주는 공장을 만들기로 했다. 현재 들어온 맞춤형 선물 주문은 총 $N$개이며, 각 맞춤형 선물마다 제작에 필요한 시간이 정
www.acmicpc.net
접근
1. X시간 내에 모든 선물을 완성할 수 있는 최소 라인 수를 요구한다. 1부터 N까지 선형탐색으로 찾을 수 있지만, N이 10만이고, X가 10억이기 때문에 시간 초과가 발생할 수 있다. 따라서 log의 복잡도로 줄이기 위해 이분탐색을 사용해야 한다.
2. 최적해를 찾기 위해서는 가장 작은 라인의 공정 시간 + i번째 선물의 공정 시간으로 계산해야 한다. 따라서 우선순위 큐를 사용했다.
import java.io.*;
import java.util.*;
public class Main {
public static int N, X, answer = Integer.MAX_VALUE;
public static int[] dur;
//limit 개의 공정 라인으로 X시간 내에 제작할 수 있는가?
public static boolean IsPossible(int limit){
int max = 0;
//제작 시간이 가장 작은 라인을 가져오기 위함
Queue<int[]> pq = new PriorityQueue<>((o1, o2) -> {
if(o1[0] == o2[0])
return o1[1] - o2[1];
return o1[0] - o2[0];
});
for(int i = 0; i < limit; i++) {
int[] arr = {0, 0};
pq.add(arr);
}
for(int i = 0; i < N; i++){
int[] g = pq.poll();
g[0] += dur[i];
max = Math.max(max, g[0]);
pq.add(g);
}
return max <= X;
}
public static int BinSearch(){
int s = 1, e = N, mid;
while(s <= e){
mid = (s + e) / 2;
if(IsPossible(mid)){
e = mid - 1;
answer = Math.min(answer, mid);
}
else{
s = mid + 1;
}
}
return answer;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); X = Integer.parseInt(st.nextToken());
dur = new int[N]; st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++)
dur[i] = Integer.parseInt(st.nextToken());
BinSearch();
System.out.println(answer);
}
}