일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Gold 5
- 월간 코드 챌린지
- 2019 KAKAO BLIND
- Gold 4
- Level 2
- DFS
- 그리디
- SWEA
- 시뮬레이션
- next_permutation
- 프로그래머스
- 백준
- Level 4
- 삼성 SW 역량 테스트
- 브루트포스
- BFS
- Level 3
- 부스트코스
- 코드 리뷰
- 구현
- 스택/큐
- DP
- 2020 카카오 인턴십
- pass
- c++
- 코드리뷰
- Web
- 백트래킹
- 2020 KAKAO BLIND
- level 1
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 2477 차량 정비소 본문
문제
SWEA 모의 SW 역량테스트 - 2477 차량 정비소
문제 풀이
접근 방식
주어진 접수 창구 번호와 정비 창구 번호를 이용한 고객들의 고객 번호의 합을 구하는 문제이다.
이 문제는 주어진 조건들을 고려하여 그대로 구현하는 시뮬레이션 문제였다.
그래서 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;
}
실행 결과
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA][모의 SW 역량테스트][C++] 5648 원자 소멸 시뮬레이션 (0) | 2020.08.27 |
---|---|
[SWEA][모의 SW 역량테스트][C++] 5653 줄기세포배양 (0) | 2020.08.24 |
[SWEA][모의 SW 역량테스트][C++] 5656 벽돌 깨기 (0) | 2020.08.23 |
[SWEA][모의 SW 역량테스트][C++] 2105 디저트 카페 (0) | 2020.08.22 |
[SWEA][모의 SW 역량테스트][C++] 5650 핀볼 게임 (0) | 2020.08.13 |