문제 링크: https://www.acmicpc.net/problem/5430
덱(std::deque
)을 쓰거나 투포인터로 푸는 방법이 있겠습니다. 덱의 맨 앞, 뒤에 넣고 빼는 연산은 O(1)의 시간이 걸리는데, 벡터(std::vector
)의 경우 맨 앞에 추가할 경우 배열 전체를 한칸씩 뒤로 밀어야 하니 O(n)의 시간이 걸리니 안됩니다.
D 연산도 std::reverse
등으로 구현하면 안됩니다. reverse는 O(n) 시간복잡도를 가지니 안됩니다. bool 변수를 이용하는게 낫습니다.
예외처리를 좀 꼼꼼히 해줘야 되는 문제입니다. 빈 배열을 입력받을 때라든지, 빈 배열에서 D나 R을 수행할 때 체크를 잘 해줘야 합니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int t;
cin >> t;
while (t--) {
string p;
int n;
cin >> p >> n;
char ign;
deque<int> dq(n);
cin >> ign;
for (auto& c : dq) {
cin >> c >> ign;
}
if (!n) cin >> ign;
bool rev = false;
bool err = false;
for (auto& ch : p) {
if (ch == 'R') rev ^= 1;
else {
if (dq.empty()) {
err = true;
break;
}
if (rev)
dq.pop_back();
else
dq.pop_front();
}
}
if (err)
cout << "error\n";
else {
cout << "[";
if (rev) {
for (auto rit = dq.rbegin(); rit != dq.rend(); ++rit) {
cout << *rit;
if (rit + 1 != dq.rend())
cout << ",";
}
}
else {
for (auto it = dq.begin(); it != dq.end(); ++it) {
cout << *it;
if (it + 1 != dq.end())
cout << ",";
}
}
cout << "]\n";
}
}
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 17070: 파이프 옮기기 1 (0) | 2020.07.12 |
---|---|
[백준][C++] 1931: 회의실배정 (0) | 2020.07.12 |
[백준][C++] 19236: 청소년 상어 (0) | 2020.07.11 |
[백준][C++] 1780: 종이의 개수 (0) | 2020.07.11 |
[백준][C++] 1764: 듣보잡 (0) | 2020.07.10 |