스케줄링 알고리즘 구현
1. FIFO(First In First Out)
public class FIFO {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Queue<Integer> start = new LinkedList<>();
Queue<Integer> time = new LinkedList<>();
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
start.add(Integer.valueOf(st.nextToken()));
time.add(Integer.valueOf(st.nextToken()));
}
int totalTime = 0;
while(!start.isEmpty()){
int nowStart = start.poll();
int nowTime = time.poll();
if(totalTime < nowStart){ //큐에 늦게 들어오는 경우 대기시간
totalTime = nowStart;
}
totalTime = totalTime + nowTime;
}
System.out.println("총 걸린 시간 :" + totalTime);
}
}
2. LIFO(Last In First Out)
public class LIFO {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] jobs = new int[n][2];
boolean[] isClear = new boolean[n];
Stack<int[]> stack = new Stack<>();
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
jobs[i][0] = Integer.parseInt(st.nextToken());
jobs[i][1] = Integer.parseInt(st.nextToken());
}
int time = 0;
boolean isStackEnd = false;
boolean isJobEnd = false;
while(true){
if(isStackEnd && isJobEnd) break;
isJobEnd = true;
isStackEnd = false;
for (int i = 0; i < n; i++) {
if(jobs[i][0] <= time && !isClear[i]){
int[] temp = new int[2];
temp[0] = jobs[i][0];
temp[1] = jobs[i][1];
stack.add(temp);
isClear[i] = true;
isJobEnd = false;
break; }
}
for (int i = 0; i < n; i++) {
if(!isClear[i]){
isJobEnd = false;
}
}
while(true){
if(stack.isEmpty()){
isStackEnd = true;
break; }
int[] now = stack.pop();
if(now[1] == 0){
continue;
}
now[1]--;
stack.add(now);
break; }
time++;
}
System.out.println(time-1);
}
}
RR(Round Robin)
public class RR {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int rrTime = Integer.parseInt(br.readLine());
boolean[] isClear = new boolean[n];
int[][] jobs = new int[n][2];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
jobs[i][0] = Integer.parseInt(st.nextToken());
jobs[i][1] = Integer.parseInt(st.nextToken());
}
int time = 0;
boolean isFinish = false;
while(true){
boolean nothing = false;
if(isFinish) break;
for (int i = 0; i < n; i++) {
if(!isClear[i]){
isFinish = false;
break; }
isFinish = true;
}
for (int i = 0; i < n; i++) {
if(jobs[i][0] > time) continue;
if(isClear[i]) continue;
if(jobs[i][1] < rrTime){
time = time + jobs[i][1];
isClear[i] = true;
nothing = true;
continue; }
jobs[i][1] = jobs[i][1] - rrTime;
time = time + rrTime;
nothing = true;
}
if(!nothing){
time++;
}
}
System.out.println(time-1);
}
}