선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
입력
R이 false인 상태에서 R이 왔으므로 R값을 True로 바꿔준다.
D가 2번오므로 뒤에서 덱을 2번 뺴내면 된다.
R값이 false이면 앞에서 덱을 빼내고 , R값이 true이면 뒤에서 덱을 뺴내면 된다.
#include<iostream>
#include<string>
#include<deque>
#include<cstring>
#include<cctype>
using namespace std;
int main(void){
int t;
cin >> t; //테스트 케이스의 개수
for(int i = 0;i<t;i++){
bool R = false; //R값이 들어오면 true, R값인 tre인 상태에서 다시 들어오면 false
bool is_error = false;//error가 나면 true로 바뀜
deque <int> dq; //덱 라이브러리
string str;
cin >> str; //수행할 함수 (ex.RDD) 입력받기
int n;
cin >> n; //배열의 개수 입력
string arr; //[1,2,3,4,5...]와 같은 문자열 -> 문자열에서 숫자로 바꾸고 덱에 넣기
cin >> arr;
string temp; //임시 문자열
for(int i = 0;i<arr.size();i++){ //arr의 길이만큼 돌면서
if(isdigit(arr[i]) != 0 && arr[i+1] == ','){
temp = temp + arr[i];
int n = stoi(temp);
dq.push_back(n);
temp = "";
}
/*arr[i]가 숫자이고 arr[i+1](숫자의 다음 배열값)이 ','라면
빈문자열에 arr[i]를 더해주고 string->int한 결과를 n에저장하고
덱에 넣는다.
임시 문자열 temp 초기화.
*/
else if(isdigit(arr[i]) != 0 && isdigit(arr[i+1]) != 0){
temp = temp + arr[i];
}
/*arr[i]가 숫자이고 arr[i+1]도 숫자이면 문자열을 더해나간다
*/
else if(isdigit(arr[i])!= 0 && arr[i+1] == ']'){
temp = temp + arr[i];
int n = stoi(temp);
dq.push_back(n);
temp = "";
}
/*arr[i]가 숫자이고 arr[i+1]이 ']'라면
temp를 더해주고 temp를 int로 바꾼 값을 덱에 넣어준다
*/
}
for(int i = 0;i<str.size();i++){//함수의 길이만큼 루프 돌리면서
if(str[i] == 'R'){ //R이들어오면 false인경우 true로 true인 경우는 false로 바꿈
if(R == false){
R = true;
}
else if(R == true){
R = false;
}
}
else if(str[i] == 'D'){ //D일떄
if(dq.empty()){ //덱이 비어있으면 error출력 후 is_error를 참으로 갱신
cout << "error";
is_error = true;
break;//바로 루프 탈출
}
else if(!dq.empty()){//덱이 비어있지 않다면
if(R == false){ //R이 fasle인 경우 앞의 원소 뺴내고
dq.pop_front();
}
else if(R == true){ //R이 true인경우 뒤의 원소 뺴내기
dq.pop_back();
}
}
}
}
if(is_error != true){ //error가 발생한 경우를 제외하고 '['출력
cout << '[';
}
while(1){
if(R == false){ //R이 거짓이면
if(dq.empty()){
break;
}
cout << dq.front(); //앞에서 원소 뽑고
if(!dq.empty()){ //앞의 원소 제거
dq.pop_front();
if(dq.size() != 0){ //덱의 사이즈가 0이 아니면 ,출력하기
cout << ',';
}
}
}
else if(R == true){ //R이 참인경우
if(dq.empty()){ //뒤에서 원소 빼내고 뒤에서 원소 제거
break;
}
cout << dq.back();
if(!dq.empty()){
dq.pop_back();
if(dq.size() != 0){ //덱의 사이즈가 0이 아니면, ㄹ출력하기
cout << ',';
}
}
}
}
if(is_error != true){ //error가 아니면 ']출력'
cout << ']';
}
cout << '\n';
}
}