보자마자 앞, 뒤로 카운트하면서 표현해주면 된다고 생각했다...
#include <iostream>
#include <string>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
string deq[100001];
while (T--)
{
string p, arrSTR, num = "", output;
bool isTurn = false;
int n, start = 0, end = 0;
cin >> p >> n;
cin.ignore();
getline(cin, arrSTR);
for (char c : arrSTR)
{
if (c == ',' || c == ']')
{
deq[end++] = num;
num = "";
}
else if (48 <= c && 57 >= c)
{
num += c;
}
}
for (char c : p)
{
if (c == 'R')
isTurn = !isTurn;
else
{
n--;
if (isTurn)
--end;
else
++start;
}
}
if (n < 0)
{
output = "error";
}
else
{
output = "[";
int s = isTurn ? end - 1 : start;
int e = isTurn ? start - 1 : end;
int plus = isTurn ? -1 : 1;
while (s != e)
{
output += deq[s];
s += plus;
if (s == e)
break;
output += ",";
}
output += "]";
}
cout << output << "\n";
}
return 0;
}
숫자에 해당하는 부분만 추출하여 저장해준다.
뒤집기 여부를 bool 변수로 확인해주며 앞 또는 뒤를 삭제해주고 출력할 때도 앞 또는 뒤부터 출력하게 해주었다.
결국 앞, 뒤를 제어해주는 것이기에 덱을 사용하면 더 깔끔하게 나올 것이다.
이 문제에 무서운 점은 배열을 줄 때 공백이 포함될 수 있다는 점이다. 나 또한 찾아보고서 알게 됐다...
그렇기에 cin만으로 해결해선 안 되고 getline을 사용해줘야 한다.
문제 외적으로는 100,001개의 배열을 선언하면 이상하게도 내 VSCode환경에서는 입력받기도 전에 꺼져버리는 것이다. "그래서 String 배열을 크게 받으면 안 되는구나!" 라는 오해를 해버렸고 배열의 정수가 100을 못 넘는다는 것을 배열의 크기가 100을 안 넘는다고 이해해버렸다. 비몽사몽 한 상태였기에 더 잘못 이해한 것 같다.
비교적 쉬운 문제임에도 오래 걸렸던 것에는 공백이 포함된다는 점과 내 환경에서는 100,001개의 배열이 실행 안 됐다는 점이 맞물렸던 것 같다.