구현 자체는 복잡하지 않지만, 

 

숫자가 많아서 헷갈리는 요소들과 순서 배치때문에 애를 먹었다.

 

정답 코드를 아래 공유한다.

 

설명은 미안하지만 없음 ㅠㅠ

 

java.io.BufferedReader;</div><div

 

 

 

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Solution {
    private static int sum;
 
    public static void main(String[] args) throws Exception {
 
        FastScanner scan = new FastScanner();
        int testcases = scan.nextInt();
 
        for (int testcase = 1; testcase <= testcases; testcase++) {
            int desk_num = scan.nextInt();
            int fix_num = scan.nextInt();
            int customer_num = scan.nextInt();
            int pulse_a = scan.nextInt() - 1;
            int pulse_b = scan.nextInt() - 1;
 
            
            //[i][0] : i 번째 접수/정비에서 걸리는 시간 
            //[i][1] : i 번째 접수/정비에서 걸린 시간 ([i][0] 부터 시작하며 1씩 떨어지다가 0이 되면 끝)
            //[i][2] : i 번째 접수/정비를 이용하는 고객의 번호 
            int[][] desks = new int[desk_num][3]; //desks 는 접수 창구 
            for (int i = 0; i < desk_num; i++) {
                desks[i][0= scan.nextInt();
            }
            int[][] fixs = new int[fix_num][3]; //fixs 는 정비 창구 
            for (int i = 0; i < fix_num; i++) {
                fixs[i][0= scan.nextInt();
            }
            int[] customers = new int[customer_num]; //customers 는 올 손님들. index 가 손님 번호, 배열값이 오는 시간
            for (int i = 0; i < customer_num; i++) {
                //천만다행으로 customers 값은 오른차순으로 미리 정렬이 되어 있다! 정렬 안 되어 있었으면 복잡해졌을꺼야. 
                customers[i] = scan.nextInt();
            }
            sum = 0;
            func(desk_num, fix_num, customer_num, pulse_a, pulse_b, desks, fixs, customers);
 
            if (sum == 0)
                sum = -1;
            System.out.println("#" + testcase + " " + sum);
        }
    }
 
    private static void func(int desk_num, int fix_num, int customer_num, int pulse_a, int pulse_b, int[][] desks,
            int[][] fixs, int[] customers) {
        int count = 0;
        Queue<Integer> desk_Q = new LinkedList<>();
        Queue<Integer> fix_Q = new LinkedList<>();
        HashMap<Integer, Integer> track = new HashMap<>();
 
        //시간은 1씩 올라간다.
        for (int time = 0, cus = 0;; time++) {
 
            //사람들이 다 도착했고,접수/정비에 사람이 없으면 끝냄.
            if (cus >= customer_num && count == 0)
                break;
 
            //시간에 맞춰 사람들이 도착한다. 도착한 순서대로 desk_Q 큐에 넣는다.
            while (cus < customer_num && customers[cus] == time) {
                desk_Q.add(cus++);
                count++;
            }
 
            // fix count down
            for (int fix = 0; fix < fix_num; fix++) {
                if (fixs[fix][1> 0) {
                    fixs[fix][1]--;
                    // if fix job is done
                    if (fixs[fix][1== 0) {
                        count--;
                        int a = track.get(fixs[fix][2]);
                        int b = fix;
                        if (pulse_a == a && pulse_b == b) {
                            sum += fixs[fix][2+ 1;
                        }
                    }
                }
            }
            // desk count down
            for (int desk = 0; desk < desk_num; desk++) {
                if (desks[desk][1> 0) {
                    desks[desk][1]--;
                    // if desk job is done
                    if (desks[desk][1== 0) {
                        fix_Q.add(desks[desk][2]);
                    }
                }
            }
            // put customers to fixs
            for (int fix = 0; fix_Q.size() > 0 && fix < fix_num; fix++) {
                if (fixs[fix][1== 0) {
                    fixs[fix][1= fixs[fix][0];
                    fixs[fix][2= fix_Q.poll();
                }
            }
            // put customers to desks
            for (int desk = 0; desk_Q.size() > 0 && desk < desk_num; desk++) {
                if (desks[desk][1== 0) {
                    desks[desk][1= desks[desk][0];
                    desks[desk][2= desk_Q.poll();
                    track.put(desks[desk][2], desk);
                }
            }
        }
 
    }
 
    private static class FastScanner {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
 
        private int nextInt() throws Exception {
            if (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(br.readLine());
            }
            return Integer.parseInt(st.nextToken());
        }
 
        private String nextString() throws Exception {
            return br.readLine();
        }
    }
}
cs

+ Recent posts