기술 블로그

2477번 차량 정비소 본문

알고리즘 문제/SW Expert Academy

2477번 차량 정비소

parkit 2018. 9. 14. 10:13
728x90
반응형

문제 : https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV6c6bgaIuoDFAXy



엄청 어려웠다. 


이와 같은 유형(http://hsdevelopment.tistory.com/27)을 잘 못 풀겠다.


시간에 따라 어디를 이용하는 유형..


다른 분의 코드를 참고하였다.




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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
 
using namespace std;
 
int N = 0, M = 0, K = 0, A = 0, B = 0;
 
int a[10= { 0, }; // 접수 창구가 고장을 접수하는 데 걸리는 시간
int a_time[10= { 0, }; // 위와 같다
 
int b[10= { 0, }; // 정비 창구가 차량을 정비하는 데 걸리는 시가
int b_time[10= { 0, }; // 위와 같다
 
int arrive[1003= { 0, }; // 고객이 차량 정비소를 방문하는 시간
 
int a_use[10= { 0, }; 
// a_use[i] = i번 째 접수 창구를 이용하는 고객 번호
 
int b_use[10= { 0, };
// b_use[i] = i번 째 정비 창구를 이용하는 고객 번호
 
bool check[1003= { false, };
 
int result = 0;
 
queue<int> a_waiting; // 정수 창구로 가기 위한 대기열
queue<int> b_waiting; // 정비 창구로 가기 위한 대기열
 
void findNumber(int time, int cnt)
{
    if (cnt == K) return// 완료
 
    // 시간 순서로 접수 창구로 가기 위한 대기열에 배치
    for (int i = 1; i <= K; i++)
    {
        if (time == arrive[i]) a_waiting.push(i);
        else if (time < arrive[i]) break;
    }
 
    // 접수 창구 배정
    for (int i = 1; i <= N; i++)
    {
        if (a_waiting.empty()) break;
 
        if (a_use[i] == -1// i 번 째 접수 창구를 이용하는 사람이 없다면
        {
            if (i == A) check[a_waiting.front()] = true;
 
            a_use[i] = a_waiting.front();
            a_waiting.pop();
        }
    }
 
    // 정비 창구 배정
    for (int i = 1; i <= M; i++)
    {
        if (b_waiting.empty()) break;
 
        if (b_use[i] == -1// i 번 째 정비 창구를 이용하는 사람이 없다면
        {
            if (i == B && check[b_waiting.front()]) result += b_waiting.front(); // not result += i;
 
            b_use[i] = b_waiting.front();
            
            b_waiting.pop();
            
            ++cnt; 
            // 접수 창구 코드에 쓰면 안 된다. 
            // 37번 째 코드 때문에 원하는 타이밍보다 더 빨리 탈출해버리기 때문이다 
        }
    }
 
    // 1초 경과 : 접수 창구
    for (int i = 1; i <= N; i++)
    {
        if (a_use[i] != -1)
        {
            --a_time[i]; // 1초 감소
 
            if (a_time[i] == 0)
            {
                a_time[i] = a[i];
                b_waiting.push(a_use[i]); // 접수 창구에서의 시간이 끝났으므로, 정비 창구 대기열로 배치
                a_use[i] = -1;
            }
        }
    }
 
    // 1초 경과 : 정비 창구
    for (int i = 1; i <= M; i++)
    {
        if (b_use[i] != -1)
        {
            --b_time[i];
 
            if (b_time[i] == 0)
            {
                b_time[i] = b[i];
                b_use[i] = -1;
            }
        }
    }
 
    findNumber(time + 1, cnt);
 
    return;
}
 
void init() // 초기화
{
    result = 0;
 
    while (!a_waiting.empty())
    {
        a_waiting.pop();
    }
 
    while (!b_waiting.empty())
    {
        b_waiting.pop();
    }
 
    memset(a_use, -1sizeof(a_use));
    memset(b_use, -1sizeof(b_use));
 
    memset(check, falsesizeof(check));
}
 
int main(void)
{
    int T = 0// 테스트 케이스
 
    scanf("%d"&T);
 
    for (int tc = 1; tc <= T; tc++)
    {
        init();
 
        scanf("%d %d %d %d %d"&N, &M, &K, &A, &B);
 
        for (int i = 1; i <= N; i++)
        {
            // 접수 창구
            scanf("%d"&a[i]);
 
            a_time[i] = a[i];
        }
 
        for (int i = 1; i <= M; i++)
        {
            // 정비 창구
            scanf("%d"&b[i]);
 
            b_time[i] = b[i];
        }
 
        for (int i = 1; i <= K; i++)
        {
            // i번 째 고객이 도착한 시간
            scanf("%d"&arrive[i]);
        }
 
        findNumber(00);
 
        printf("#%d %d\n", tc, result != 0 ? result : -1);
    }
 
    return 0;
}
cs


728x90
반응형

'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글

1767번 프로세서 연결하기  (0) 2019.04.14
5653번 줄기세포 배양  (2) 2018.10.05
2117번 홈 방범 서비스  (0) 2018.09.01
2105번 디저트 카페  (0) 2018.08.31
2382번 미생물 격리  (0) 2018.08.29