https://www.acmicpc.net/problem/5430
이 문제는 deque를 이용해서 해결해야 한다.
R 연산의 경우 deque의 특성인 앞뒤 빼기가 가능하다는 점을 통해
boolean 타입의 변수를 통해 reverse 상태면 D연산 시 뒤를 빼도록 하고
reverse상태가 아니면 D 연산 시 앞을 빼도록 한다.
입력 배열의 형태가 [1,2,3] 과 같은 형태이므로 이 값을 deque에 삽입하기 위해 숫자를 빼내야한다.
이를 위해 문자열의 길이만큼 배열을 순회하고 현재 문자열의 요소가 숫자인 경우 민 문자열에 현재 요소를 합친다.
이후 숫자가 아닌 값인 ','이나 ']'을 만나는 경우 deque에 값을 삽입한다.
출력 시 reverse 상태인 경우 뒤에서 부터 출력하고, reverse 상태가 아니면 앞에서 부터 출력한다.
#include <iostream>
#include <deque>
#include<string>
#include<algorithm>
using namespace std;
int len;
string x;
bool error = false;
bool rever = false;
deque<int> makeArray() {
deque<int> arr;
string s = "";
for (int i = 0; i < x.length(); i++) {
if (isdigit(x[i])) {
s += x[i];
}
else {
if (!s.empty()) {
arr.push_back(stoi(s));
s = "";
}
}
}
return arr;
}
void printArray(deque<int> arr) {
cout << "[";
if (!arr.empty()) {
if (rever) {
for (int i = arr.size() - 1; i > 0; i--) {
cout << arr[i] << ",";
}
cout << arr[0];
}
else {
for (int i = 0; i < arr.size() - 1; i++) {
cout << arr[i] << ",";
}
cout << arr[arr.size() - 1];
}
}
cout << "]"<<'\n';
}
void AC(deque<int>& arr, string p) {
for (int i = 0; i < p.length(); i++) {
if (p[i] == 'R') {
if (rever) rever = false;
else rever = true;
}
if (p[i] == 'D') {
if (arr.empty()) {
cout << "error" << '\n';
error = true;
return;
}
if (rever)
arr.pop_back();
else
arr.pop_front();
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
for (int i = 0; i < T; i++) {
string p;
cin >> p;
cin >> len;
cin >> x;
deque<int> arr = makeArray();
rever = false;
error = false;
AC(arr, p);
if (!error)
printArray(arr);
}
}
'Baekjoon Review' 카테고리의 다른 글
[Silver 3] 15650번 N과 M (2) (0) | 2023.11.06 |
---|---|
[Gold 4] 7662번 이중 우선순위 큐 (0) | 2023.11.03 |
[Silver 3] 2606번 바이러스 (0) | 2023.11.03 |
[Silver 2] 21736번 현내기는 친구가 필요해 (0) | 2023.11.03 |
[Silver 1] 14940번 쉬운 최단거리 (0) | 2023.11.03 |