이 문제도 class에 있는 문제라서 풀게 되었다.
처음에 접근했던 방식은
문제에서 요구하는 대로 시뮬레이션 하는 방식으로 풀었는데 시간초과 나버렸다.
생각해보니 굳이 그렇게 할 필요는 없을 것 같아 다시 생각한 내용은 다음과 같다.
1. 어차피 'D' 명령어는 전체 숫자 배열의 앞 뒤에서만 제거한다.
2. 'R' 명령어가 나오면 제거할 방향을 바꿔준다.
3. 그래서 제거를 진짜 해줄 필요는 없고 투포인터 느낌으로 유효한 배열의 범위를 표시해주기로 했다.
4. 결과에 따라 알맞은 결과값을 출력한다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int tc;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> tc;
while (tc--) {
string p; cin >> p;
int n; cin >> n;
string temp; cin >> temp;
vector<int> x;
int lastcomma = 0;
for (int i = 0; i < temp.length(); ++i) {
if ((temp[i] == ',' || temp[i] == ']') && i - lastcomma > 1) {
x.push_back(stoi(temp.substr(lastcomma + 1, i - lastcomma - 1)));
lastcomma = i;
}
}
int r = 0, d = 0;
int f = 0, b = n - 1;
bool flag = true;
for (int i = 0; i < p.length(); ++i) {
if (p[i] == 'R') {
r++;
flag = !flag;
}
else if (p[i] == 'D') {
d++;
if (flag) f++;
else b--;
}
}
if (f > b + 1)
cout << "error" << '\n';
else {
cout << '[';
if (flag) {
for (int i = f; i <= b; ++i) {
cout << x[i];
if (i != b)
cout << ',';
}
} else {
for (int i = b; i >= f; --i) {
cout << x[i];
if (i != f)
cout << ',';
}
}
cout << ']' << '\n';
}
}
}