구현 자체는 복잡하지 않지만,
숫자가 많아서 헷갈리는 요소들과 순서 배치때문에 애를 먹었다.
정답 코드를 아래 공유한다.
설명은 미안하지만 없음 ㅠㅠ
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 |
'Coding Interview' 카테고리의 다른 글
[2020 KAKAO BLIND RECRUITMENT] 자물쇠와 열쇠 (0) | 2020.06.10 |
---|---|
[SW Expert Academy] 2112. [모의 SW 역량테스트] 보호 필름 (0) | 2020.06.05 |
[JAVA] 전체 값을 나열하는 순열 코드 (0) | 2020.04.27 |
CS 인터뷰 준비 방법(코딩 테스트, 전산학) (0) | 2020.04.09 |
[Baekjoon] 2790번 F7 (0) | 2020.03.26 |