[프로그래머스/LV3] [PCCP 모의고사 1] 4번 - 우선순위큐 (Java)
[PCCP 모의고사 #1] 4번 - 운영체제 문제를 Java로 해결한 풀이입니다. 우선순위큐를 활용하여 각 대기시간을 구합니다.
[PCCP 모의고사 #1] 4번 - 운영체제
🙋♂️ 들어가며
문제를 읽어보니 총 2단계로 진행하면 되겠다
1단계 -> 가장 실행시간이 빠르고, 실행 시작시간이 같다면 점수가 낮은 것을 첫번쨰로 삽입
2단계 -> pq를 생성후 점수가 낮은, 만약 점수가가 같다면 실행시작시간이 빠를 수록
testcase-1
1
2
3
4
3순위 -> {3, 6, 4}
2순위 -> {4, 2, 5}
1순위 -> {1, 0, 5}
4순위 -> {5, 0, 5}
위 테스트케이스를 계산하면 이렇게 된다
| 호출 시각 | 실행 시작 시각 |
|---|---|
| 0 | 0 |
| 2 | 5 |
| 6 | 10 |
| 0 | 14 |
testcase-2
1
2
1순위 -> {3, 10, 5}
2순위 -> {1, 100, 10}
✅ 정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.util.PriorityQueue;
import java.util.Arrays;
class Solution {
public long[] solution(int[][] program) {
long[] answer = new long[11];
// 1. 정렬 (첫번째 값은 무조건 빠른 실행순서)
Arrays.sort(program, (a,b) -> {
// 1-1. 시간이 같다면 우선순위 오름차순
if (a[1] == b[1]) {
return Integer.compare(a[0], b[0]);
}
// 1-2. 원칙적으로는 시간 오름차순
return Integer.compare(a[1], b[1]);
});
// 2. pq
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b) -> {
// 2-1. 만약 우선순위가 같으면 실행시각 시간순
if(a[0] == b[0]) {
return Integer.compare(a[1], b[1]);
}
// 2-2. 우선시간 순
return Integer.compare(a[0], b[0]);
});
long cur_time = 0;
int idx = 0;
int N = program.length;
// 3. 검사 (프로그램이 남아있거나 대기열에 프로그램이 있는동안 반복)
while (idx < N || !pq.isEmpty()) {
// 3-1. 현재시각까지 호출된 모든 프로그램을 대기열(pq)에 삽입
while (idx < N && program[idx][1] <= cur_time) {
pq.offer(program[idx]);
idx++;
}
// 3-2. 대기열에 프로그램이 있는 경우 실행
if (!pq.isEmpty()) {
int[] cur = pq.poll();
int cur_score = cur[0];
int cur_start = cur[1];
int cur_lasting = cur[2];
// 3-2-a. 대기시간 = (현재시간 - 호출시간)
answer[cur_score] += (cur_time - cur_start);
// 3-2-b. 현재 작동시간 추가
cur_time += cur_lasting;
}
// 3-3. 대기열은 비었지만 호출될 프로그램이 남은 경우
else if (pq.isEmpty()) {
// 3-3-a. 다음으로 가장 빨리 호출될 프로그램으로 점프
cur_time = program[idx][1];
}
}
// 4. 모든 프로그램이 종료된 시간 저장
answer[0] = cur_time;
return answer;
}
}
This post is licensed under CC BY 4.0 by the author.
