<문제 소개>
<소스 코드>
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
using namespace std;
int main()
{
// 쓰레드 환경이 아닐때 버퍼를 분리하여 처리속도를 빠르게 해줌
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N); // 큐인지 스택인지 구별하는 수열
for (int i = 0; i < N; i++) cin >> A[i];
vector<int> B(N); // 각 자료구조에 들어있는 원소들의 수열
for (int i = 0; i < N; i++) cin >> B[i];
int M;
cin >> M;
deque<int> C(M); // 삽입할 원소를 담은 수열
for (int i = 0; i < M;i++) cin >> C[i];
// queuestack 동작
for (int i = 0; i < N; i++)
{
if (A[i] == 0)
{
// 큐인 경우
C.push_front(B[i]); // 큐의 원소를 맨 앞에 삽입
C.pop_back(); // 맨 뒤의 원소 삭제
}
else
{
// 스택인 경우 -> 그냥 넘어감
}
}
// 원소 출력
for (int i = 0; i < C.size(); i++)
{
cout << C[i] << " ";
}
return 0;
}
<풀이과정>
1. N을 입력받고, N만큼 반복하며 큐인지 스택인지 구별하는 수열을 입력받아 벡터 A에 담고, 각 자료구조에 들어있는 원소들의 수열을 입력받아 벡터 B에 담는다.
2. M을 입력받고, M만큼 반복하며 삽입할 원소들의 수열을 입력받아 C에 담아준다.
3. 다시 N만큼 반복하며 queuestack의 동작을 진행하는데, A의 i번째 원소에 따라 큐인 경우와 스택인 경우를 나누고, 해당 원소가 0인 큐의 동작을 하는 경우에는 B의 i번째 원소와 C의 원소들을 쭉 나열했을 때, 앞부터 C의 원소의 갯수만큼 빼내어 다음으로 넘어가는 동작을 한다.
4. 그러므로 큐의 동작을 하는 경우, C에 앞에 B의 i번째 원소를 넣어주고, C의 맨 뒤의 원소를 빼주는 작업을 해준다.
5. 다음으로 스택의 동작을 하는 경우 B의 i번째 원소와 C의 원소들을 쭉 나열하고 뒤부터 C의 원소이 갯수만큼 빼내어 다음으로 넘어가기 때문에 C를 그대로 가져가 다음으로 넘어가기 때문에 아무동작을 하지 않아도 된다.
6. 이렇게 모든 반복이 끝난 뒤 바뀐 C의 원소들이 queuestack의 최종 출력 원소들이므로 C의 원소들을 모두 출력해준다.
<코멘트>
조금 어려웠다!
스택과 큐를 사용해서 하는 것이 아닌 둘의 기능을 모두 가진 덱을 이용해서 푸는 것이 핵심이었던 것 같다!
이 문제를 끝으로 현재 백준의 단계별로 풀어보기의 절취선 이전의 문제들을 다 풀었다!!
이후 문제들은 백준 페이지에서 수정중이긴 하지만 문제자체가 수정 되는것이 아니라 목차가 수정되는 정도라서 그냥 풀어봐야겠다!
<제출결과>