2477. [모의 SW 역량테스트] 차량 정비소

SW 업무 관련/SW Expert Academy

2477. [모의 SW 역량테스트] 차량 정비소

WillBe_ 2018. 10. 9. 15:20

너무너무너무 어려웠다. 젠장! 정답률 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, 0sizeof(Buff));
        memset(Per, 0sizeof(Per));
        memset(Reception, 0sizeof(Reception));
        memset(Repair, 0sizeof(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