일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그리디
- 2020 카카오 인턴십
- 부스트코스
- DFS
- 프로그래머스
- 코드 리뷰
- 삼성 SW 역량 테스트
- 시뮬레이션
- 2020 KAKAO BLIND
- Web
- 월간 코드 챌린지
- next_permutation
- Gold 4
- c++
- 2019 KAKAO BLIND
- level 1
- DP
- 구현
- 스택/큐
- BFS
- 백트래킹
- pass
- 백준
- Level 2
- SWEA
- Gold 5
- 코드리뷰
- 브루트포스
- Level 4
- Level 3
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 2477 차량 정비소 본문
문제
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;
}
실행 결과
'알고리즘 > 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 |