🌞Algorithm/🔥Baekjoon
[Baekjoon] 16692_Greedy Scheduler
뿌야._.
2025. 6. 17. 11:05
문제(출처: https://www.acmicpc.net/problem/16692)
< Greedy Scheduler >
문제 풀이
PriorityQueue를 사용하여 계산이 빨리 끝나는 곳을 찾는다.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class _16692_ { // Greedy Scheduler
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
}
return o1[0] - o2[0];
}
});
int idx = 1;
int result[] = new int[c];
st = new StringTokenizer(bf.readLine());
for (int i = 0; i < c; i++) {
if (idx <= n) {
queue.add(new int[] { Integer.parseInt(st.nextToken()), idx++, i });
} else {
int info[] = queue.poll();
result[info[2]] = info[1];
queue.add(new int[] { info[0] + Integer.parseInt(st.nextToken()), info[1], i });
}
}
while (!queue.isEmpty()) {
int info[] = queue.poll();
result[info[2]] = info[1];
}
for (int i = 0; i < c; i++) {
bw.write(result[i] + " ");
}
bw.flush();
}
}
변수)
n, c : 계산원 수, 고객 수
queue : PriorityQueue <int [시간, 계산대 번호, 입력 순서]>
idx : 계산대 번호
result : 고객의 장바구니를 처리할 계산원 번호
계산원 수 n과 고객 수 c를 입력받는다. c만큼 고객의 장바구니를 처리하는 데 걸리는 시간을 입력받으며 다음 과정을 거친다.
1) 아직 비어있는 계산대가 있다면 가장 적은 숫자를 가진 계산원에게 배정
2) 계산대가 비어있지 않다면 queue.poll을 한 후 그 계산대 위치에 배정
PriorityQueue가 빌 때까지 poll 한 후 계산대 번호를 result 배열에 저장한다. 최종 result 배열을 출력한다.