에디터

에디터

2019, Jun 02    
  • https://www.acmicpc.net/problem/1406
  • 계속 확인해야 하는 대상이 커서 주위의 값이고 커서와 멀리 있는 값은 전혀 볼 필요가 없습니다.
  • 따라서 stack을 2개 만들어서 커서의 왼쪽과 오른쪽의 값만을 계속 추적하면 효율적으로 커서의 위치 및 값 추가를 관리할 수 있습니다.
  • L이면 left 스택의 top을 right 스택으로 옮깁니다.
    • left가 비어있으면 무시합니다.
  • D이면 right스택의 top을 left 스택으로 옮깁니다.
    • right가 비어있으면 무시합니다.
  • B이면 left 스택을 pop 합니다. -left가 비어있으면 무시합니다.
  • P이면 left에 문자를 push 합니다.
  • 마지막 left를 right에 모두 push한 후 right를 top부터 차례대로 읽어옵니다.

#include <iostream>
#include <vector>
#include <stack>
#include <string>

using namespace std;

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	string s;
	cin >> s;

	int N;
	cin >> N;

	stack<char> left, right;

	for (char c : s) {
		left.push(c);
	}

	while (N--) {
		string cmd, c;
		cin >> cmd;

		if (cmd == "L") {
			if (left.empty()) {
				continue;
			}
			char top = left.top();
			left.pop();

			right.push(top);
		}
		else if (cmd == "D") {
			if (right.empty()) {
				continue;
			}
			char top = right.top();
			right.pop();

			left.push(top);
		}
		else if (cmd == "B") {
			if (left.empty()) {
				continue;
			}
			left.pop();
		}

		else if (cmd == "P") {
			cin >> c;
			left.push(c[0]);
		}
	}

	while (!left.empty()) {
		char c = left.top();
		left.pop();
		right.push(c);
	}

	string ans = "";
	while (!right.empty()) {
		ans += right.top();
		right.pop();
	}

	cout << ans << endl;
}