Min:D's Devlog

[SWEA][모의 SW 역량테스트][C++] 2477 차량 정비소 본문

알고리즘/SWEA

[SWEA][모의 SW 역량테스트][C++] 2477 차량 정비소

Min:D 2020. 8. 26. 12:00

문제

SWEA 모의 SW 역량테스트 - 2477 차량 정비소

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


문제 풀이

접근 방식

주어진 접수 창구 번호와 정비 창구 번호를 이용한 고객들의 고객 번호의 합을 구하는 문제이다.

이 문제는 주어진 조건들을 고려하여 그대로 구현하는 시뮬레이션 문제였다.

그래서 4가지 과정을 통해 문제를 해결하였다.

 

1. 접수 대기열 추가

 

현재 시간에 온 고객들을 접수 대기열에 넣어주었다.

접수 대기열을 로 구현하여 방문한 순서대로 사용할 수 있도록 해주었다.

 

 

2. 접수 & 수리 대기열 추가

 

접수 대기열에 고객이 있고, 접수 창구가 빈 창구일 경우에 대기열에 있는 고객을 접수 창구로 이동시켜주었다.

이때, A 번호의 창구에서 접수하는 고객인 경우에는 그 고객의 대기 번호를 a_list에 저장해주었다.

 

접수 창구는 걸리는 시간, 고객의 대기 번호, 현재 소요 시간을 저장할 수 있도록 20 × 3의 크기로 만들어주었고,

창구에 고객이 존재하면 현재 소요 시간 1씩 증가시켜주었다.

그 창구에서 걸리는 시간과 현재 소요 시간이 같아지면 접수가 완료된 것이므로

해당 고객을 수리 대기열로 보내주고, 창구를 비워주었다. 수리 대기열 또한 로 구현해주었다.

(처음에는 수리 대기열을 대기 번호순으로 사용해야 하는 줄 알고 우선순위 큐로 구현했었는데,

대기 번호 순이 아닌 접수 창구 번호 순이어서 큐를 사용해야 답을 구할 수 있다.)

 

 

3. 수리

 

접수 단계와 마찬가지로 수리 대기열에 고객이 있고, 빈 창구일 경우 대기열에 있는 고객을 수리 창구로 보내주었다.

이때, B 번호의 창구에서 접수하는 고객인 경우에는 그 고객의 대기 번호를 b_list에 저장해주었다.

 

창구에 고객이 존재하면 현재 소요 시간을 매번 1씩 증가시켜주었고,

창구에서 걸리는 시간과 현재 소요 시간이 같아지면 수리가 완료된 것이므로 창구를 비워주었다.

 

 

4. 종료 & 답 도출

 

while 문을 종료하는 조건은 모든 고객이 대기열로 보내졌고, 모든 대기열이 비워져 있으며,

접수 창구에 고객이 존재하지 않을 때이다.

 

while문 종료 시, algorithm 헤더 파일의 set_insection이라는 교집합을 구하는 메서드를 사용하여

a_list와 b_list의 교집합을 구하였고, 그 교집합 원소들의 합을 구해 답을 도출하였다.

 


풀이 코드 - C++

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char** argv)
{
    int test_case, i, k, t, c, answer;
    int T, N, M, K, A, B;
    int reception[20][3];
    int repair[20][3];
    int customer[1000];
    queue<int> rec_waiting;
    queue<int> rep_waiting;
    vector<int> a_list;
    vector<int> b_list;
    cin >> T;
    for (test_case = 1; test_case <= T; ++test_case) {
        //입력 받기
        cin >> N >> M >> K >> A >> B;
        memset(reception, 0, sizeof(reception));
        memset(repair, 0, sizeof(repair));
        memset(customer, 0, sizeof(customer));
        a_list.clear();
        b_list.clear();
        for (i = 0; i < N; i++) {
            cin >> reception[i][0];
        }
        for (i = 0; i < M; i++) {
            cin >> repair[i][0];
        }
        for (i = 0; i < K; i++) {
            cin >> customer[i];
        }
 
 
        // 접수 및 수리
        t = 0, c = 0;
        while (1) {
            // 접수 대기열 추가
            while (1) {
                if (c < K && customer[c] == t) {
                    rec_waiting.push(++c);
                    continue;
                }
                break;
            }
 
            // 접수 & 수리 대기열 추가
            for (i = 0; i < N; i++) {
                if (reception[i][1] != 0 && reception[i][2] == reception[i][0]) {   // 접수 완료
                    rep_waiting.push(reception[i][1]);
                    reception[i][1] = 0;
                }
 
                if (!rec_waiting.empty() && reception[i][1] == 0) { // 빈 창구
                    reception[i][1] = rec_waiting.front();
                    rec_waiting.pop();
                    reception[i][2] = 0;
                    if (i+1 == A)
                        a_list.push_back(reception[i][1]);
                }
 
                if(reception[i][1] != 0)
                    reception[i][2]++;
            }
 
            // 수리
            for (i = 0; i < M; i++) {
                if (repair[i][2] == repair[i][0]) { // 수리 완료
                    repair[i][1] = 0;
                }
 
                if (!rep_waiting.empty() && repair[i][1] == 0) {    // 빈 창구
                    repair[i][1] = rep_waiting.front();
                    rep_waiting.pop();
                    repair[i][2] = 0;
                    if (i + 1 == B)
                        b_list.push_back(repair[i][1]);
                }
 
                if (repair[i][1] != 0)
                    repair[i][2]++;
            }
 
            // 종료
            if (c == K && rec_waiting.empty() && rep_waiting.empty()) {
                bool check = true;
                for (i = 0; i < N; i++) {
                    if (reception[i][1] != 0) {
                        check = false;
                        break;
                    }
                }
                if(check)
                    break;
            }
 
            t++;
        }
 
        answer = 0;
        sort(a_list.begin(), a_list.end());
        sort(b_list.begin(), b_list.end());
        vector<int> result(a_list.size() + b_list.size());
        set_intersection(a_list.begin(), a_list.end(), b_list.begin(), b_list.end(), result.begin());
        for (int a : result)
            answer += a;
        if (answer == 0)
            answer = -1;
 
        cout << "#" << test_case << " " << answer<< endl;
    }
    return 0;
}

실행 결과

실행 결과 : Pass (27ms)

Comments