너무너무너무 어려웠다. 젠장! 정답률 52% 라니...좌절...............
3일에 걸쳐 5~6시간은 걸린 듯ㅜ,ㅠ
그리고 내가 구조체 속에, 인자로 구조체를 넣을 줄이야. 정말 어려운 문법을 썻다.
접근법.
처음 입력을 저장하는 배열과, 접수를 마치고 정비소로가는 사람들을 저장하기 위해 별도의 큐를 사용하였다.
1. 접수처, 정비소 사람마다 일처리 시간이 다르다. 이걸 위해 능력과, 경과 시간마다 비어있는지 일하는 중인지를 위해 별도의 변수 working을 두었다. 종업원이 처음 일을 시작하면, 종업원의 능력을 별도의 변수에 넣어주었다. 이 변수는 1턴 마다 2 이상이면 -1씩 해준다.
2. 별도의 변수 working가 2 이상이면 -1, 1이면 이제 접수처나 정비소를 떠나야 하한다. 접수처에서 1이면 별도의 큐에 넣어주고, 정비소에서 1이면 지갑 주인이 사용한 접수처A, 정비소B를 비교하여 NUM에 저장해준다.
3. 정비소는 큐에서 하나씩 빼오면서 일을 한다.
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 129 130 131 | #include <stdio.h> #include <string.h> typedef struct { int arrive, num, a, b; }Person; typedef struct { int ability, working; Person P; }Employee; int N, M, K, A, B, NUM, K_MAX, K_MIN; Person Per[1001], Buff[1001]; Employee Reception[21], Repair[21]; int main() { int Test_Case; scanf("%d", &Test_Case); for (int T = 1; T <= Test_Case; T++) { NUM = 0, K_MAX = -1, K_MIN = 9999; memset(Buff, 0, sizeof(Buff)); memset(Per, 0, sizeof(Per)); memset(Reception, 0, sizeof(Reception)); memset(Repair, 0, sizeof(Repair)); scanf("%d %d %d %d %d", &N, &M, &K, &A, &B); for (int i = 1; i <= N; i++) { scanf("%d", &Reception[i].ability); } for (int i = 1; i <= M; i++) { scanf("%d", &Repair[i].ability); } for (int i = 1; i <= K; i++) { scanf("%d", &Per[i].arrive); Per[i].num = i; if (Per[i].arrive > K_MAX) K_MAX = Per[i].arrive; if (Per[i].arrive < K_MIN) K_MIN = Per[i].arrive; } int Reception_Front = 1, Repair_Front = -1, Repair_Back = -1, t = 0, out = 0; while(1) { if (out == K) { break; } //접수처 감소 for (int i = 1; i <= N; i++) { if (Reception[i].working >= 2) { Reception[i].working--; } else if (Reception[i].working == 1) { Reception[i].working = 0; Buff[++Repair_Back].arrive = Reception[i].P.arrive; Buff[Repair_Back].a = Reception[i].P.a; Buff[Repair_Back].num = Reception[i].P.num; } } //repair 감소 for (int i = 1; i <= M; i++) { if (Repair[i].working >= 2) { Repair[i].working--; } else if (Repair[i].working == 1) { out++; Repair[i].working = 0; if (Repair[i].P.a == A && Repair[i].P.b == B) { NUM += Repair[i].P.num; } } } //접수처 입장 for (int i = 1; i <= N; i++) { if (Per[Reception_Front].arrive > t) { break; } else if (Per[Reception_Front].arrive <= t && Reception_Front <= K && Reception[i].working == 0) { Reception[i].working = Reception[i].ability; Per[Reception_Front].a = i; Reception[i].P = Per[Reception_Front]; Reception_Front++; } } //repair 입장 for (int i = 1; i <= M; i++) { if ((Repair_Front < Repair_Back) && Repair[i].working == 0) { Repair[i].working = Repair[i].ability; Repair[i].P.a = Buff[++Repair_Front].a; Repair[i].P.num = Buff[Repair_Front].num; Buff[Repair_Front].b = i; Repair[i].P.b = i; } } t++; } if (NUM == 0) NUM = -1; printf("#%d %d\n", T, NUM); } return 0; } | cs |
'SW 업무 관련 > SW Expert Academy' 카테고리의 다른 글
2382. [모의 SW 역량테스트] 미생물 격리 (525) | 2018.10.10 |
---|---|
383. [모의 SW 역량테스트] 점심 식사시간 (0) | 2018.10.09 |
1953. [모의 SW 역량테스트] 탈주범 검거 (0) | 2018.10.07 |
2115. [모의 SW 역량테스트] 벌꿀채취 (0) | 2018.10.07 |
2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2018.10.05 |