단계별 풀기에서 덱 문제라길래 이게 왜 어렵지 했으나, 알고보니 파싱, 문자열 문제였다...
#include <iostream>
#include <deque>
#include <string>
using namespace std;
int main(void){
int T,N;
string tem,arr,ans;
deque<int> d;
bool f=true;
bool e= false;
cin >> T;
for(int i=0;i<T;i++){
//초기화 함수
f= true;
e=false;
d.clear();
tem.clear();
arr.clear();
cin >> tem >> N >> arr;
// 파싱함수
for(int j=1;']'!=arr[j];j++){
if(arr[j]==','){
d.push_back(stoi(ans));
ans.clear();
continue;
}
ans.push_back(arr[j]);
}
if(ans.length()!=0){
d.push_back(stoi(ans));
ans.clear();
}
// R,D 입력하는 함수
for(int j=0;j<tem.length();j++){
if(tem[j]=='D'){ // D 일 경우
if(d.size()==0){ // deque가 비어있으면 error를 출력해야 하므로 e여부 확인하는 boolean을 true로 처리
e=true;
break;
}
if(f){ // front인지 여부 확인하는 f가 true일 경우 앞 부분 삭제
d.pop_front();
continue;
}
d.pop_back(); // 아니면 뒷 부분 삭제
}
else{ // R이 나올 경우
f= !f; // front의 여부를 확인하는 f 변수를 반대로 바꿔준다.
}
}
int D_SIZE = d.size();
// 출력하는 함수
if(e){
cout << "error" << '\n';
}
else{
cout << '[';
if(f){
for(int idx =0;idx<D_SIZE;idx++){
cout << d[idx];
if(idx != (D_SIZE-1)){
printf(",");
}
}
}
else{
for(int idx =(D_SIZE-1);idx>=0;idx--){
cout << d[idx];
if(idx != 0){
printf(",");
}
}
}
cout << ']' << '\n';
}
}
}
풀이 생략
1. 첫 초기화하는 부분과, T에 따른 반복은 생략함.
2. R,D는 단순 조건에 따른 처리이므로 주석으로 처리
for(int j=1;']'!=arr[j];j++){
if(arr[j]==','){
d.push_back(stoi(ans));
ans.clear();
continue;
}
ans.push_back(arr[j]);
}
if(ans.length()!=0){
d.push_back(stoi(ans));
ans.clear();
}
arr[j] == "[1,2,3,4,5]"
- arr[j]는 문자열로 처리되어 있고, 각 원소는 ','로 구분되어 있음.
- 따라서 ','가 나올 때마다 ans라는 정수값을 가지는 문자열 ex)"123" 을 deque에 push_back해줌.
- 마지막 원소 같은 경우는 ','가 없으므로 ans라는 문자열이 존재할 경우에만 push해줌.(문자열이 존재하지 않을 때 push해줄 경우에도 빈 값이 push 됨).
int D_SIZE = d.size();
if(e){ // error일 경우
cout << "error" << '\n';
}
else{ // error가 아닐 경우
cout << '[';
if(f){ // front부터 시작해야 할 경우
for(int idx =0;idx<D_SIZE;idx++){
cout << d[idx];
if(idx != (D_SIZE-1)){
printf(","); // 각 원소가 나올 때 마다 ','가 나와야 함. + 마지막 원소일 때는 나오면 안됨.
}
}
}
else{ // back 부터 시작해야 할 경우
for(int idx =(D_SIZE-1);idx>=0;idx--){
cout << d[idx];
if(idx != 0){
printf(","); // 각 원소가 나올 때 마다 ','가 나와야 함. + 마지막 원소일 때는 나오면 안됨.
}
}
}
cout << ']' << '\n';
}
- 기존 배열을 문자열로 파싱하는 코드
- 기존 코드에서는 반복문 조건에서 idx<D_SIZE가 아니라 for(;d.size();)형태로 구현하니 시간이 너무 많이 걸려서 바꿨음.
- c++에서 제공하는 함수들을 너무 남용하지 말자. (시간이 더 걸림)
- 파싱 문제 에서 중요한 것은 너무 쉽게쉽게 가려하지 않기 (대부분 일일이 처리해주어야 하므로 조건 하나하나씩 잘 챙겨가면서 하기)
- deque를 굳이 안 쓰고, vector를 사용해서 front,back를 가리키는 변수만 사용해서 더 깔끔하게 구현할 수 있음.