-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathJW_214288.java
More file actions
77 lines (72 loc) Β· 3.55 KB
/
JW_214288.java
File metadata and controls
77 lines (72 loc) Β· 3.55 KB
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
67
68
69
70
71
72
73
74
75
76
77
import java.util.ArrayList;
import java.util.PriorityQueue;
class JW_214288 {
int minWaitingTime = Integer.MAX_VALUE; // μ΅μ λκΈ° μκ°
ArrayList<ArrayList<int[]>> refineReqs; // κΈ°μ‘΄μ μλ΄ μμ²μ κ°κ³΅ν΄μ μ μ₯ν 리μ€νΈ
int[][] waitingTimes; // κ° μ νλ³ μΈμμ λ°λ₯Έ μλ΄ μκ°μ μ μ₯ν λ°°μ΄
int[] consultCombi; // λ©ν μ μ‘°ν©μ λ§λ€ λ°°μ΄
public int solution(int k, int n, int[][] reqs) {
refineReqs = new ArrayList<>();
consultCombi = new int[k + 1];
waitingTimes = new int[k + 1][n - k + 2];
for (int i = 0; i < k + 1; i++)
refineReqs.add(new ArrayList<>());
// ν΄λΉ μ νμ μμ²λ³λ‘ μμ, μ’
λ£ μκ°λ§ λ¨κΉ
for (int[] req : reqs) {
refineReqs.get(req[2]).add(new int[] { req[0], req[1] });
}
calWaitingTime(k, n); // λͺ¨λ λκΈ° μκ° κ³μ°
makeConsultCombi(k, n, 1); // λ§λ€ μ μλ λͺ¨λ λ©ν μ μ‘°ν©μ ꡬν¨
return minWaitingTime;
}
// λͺ¨λ λκΈ° μκ° κ³μ°
private void calWaitingTime(int k, int n) {
// iλ² μ§Έ μ νμ λν΄μ
for (int i = 1; i < k + 1; i++) {
// jλͺ
μ μΈμμ΄ μμ λμ μ΄ λκΈ° μκ° κ³μ°
for (int j = 1; j < n - k + 2; j++) {
// νμ¬ μλ΄νκ³ μλ μΈμμ΄ λλλ μκ°μ μ€λ¦μ°¨μμΌλ‘ μ μ₯ν ν
PriorityQueue<Integer> pq = new PriorityQueue<>();
int totalWaitingTime = 0;
for (int[] req : refineReqs.get(i)) {
// νκ°ν λ©ν κ° μλ€λ©΄ μλ΄ μμ
if (pq.size() < j) {
pq.add(req[0] + req[1]);
continue;
}
// μλλΌλ©΄ λ€μ μΈμμ΄ κΈ°λ€λ¦¬λ μκ° λ° μλ΄μ΄ λλλ μκ° κ³μ°
int now = pq.poll();
int waitingTime = now - req[0];
if (waitingTime > 0) {
totalWaitingTime += waitingTime;
pq.add(now + req[1]);
} else
pq.add(req[0] + req[1]);
}
// iλ² μ§Έ μ νμ λ©ν κ° jλͺ
μμ λ 걸리λ μ΄ λκΈ° μκ°
waitingTimes[i][j] = totalWaitingTime;
}
}
}
// λ§λ€ μ μλ λͺ¨λ λ©ν μ μ‘°ν©μ ꡬν¨
// @param remainig : depthλ² μ§Έ μ νμ μ¬μ©ν μ μλ λ©ν μ μ
private void makeConsultCombi(int k, int remaining, int depth) {
// λ§μ§λ§ μ νμ λ©ν κΉμ§ μλ€λ©΄ λ¨μ μΈμλ€ μ λΆ μΆκ° ν μ΄ λκΈ°μκ° κ³μ°
if (depth == k) {
consultCombi[depth] += remaining;
int totalWaitingTime = 0;
// 미리 κ³μ°ν λκΈ° μκ°νλ‘ μ΄ λκΈ° μκ°μ κ³μ°
for (int i = 1; i < k + 1; i++) {
totalWaitingTime += waitingTimes[i][consultCombi[i]];
}
minWaitingTime = Math.min(minWaitingTime, totalWaitingTime);
consultCombi[depth] -= remaining; // λ°± νΈλνΉ
return;
}
for (int i = 1; i < remaining; i++) {
consultCombi[depth] += i; // depthλ² μ§Έ μ νμ iλ§νΌμ λ©ν λ₯Ό μΆκ°
makeConsultCombi(k, remaining - i, depth + 1); // λ¨μ λ©ν λ€λ‘ λ€μ μ ν νμ
consultCombi[depth] -= i; // λ°± νΈλνΉ
}
}
}