코딩고치

[백준][자료구조]에디터 본문

백준 알고리즘 기초/자료구조

[백준][자료구조]에디터

코딩고치 2019. 9. 5. 01:09

이 문제 역시 스택을 이용하여 프로그래밍을 하는 문제이다. 두 개의 스택을 만들어서 커서의 이동을 구현하였다.

#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	string str;
	cin >> str;
	int len = str.length(); //커서 왼쪽 문자열 길이
	int len2 = 0; //커서 오른쪽 문자열 길이

	int n;
	cin >> n;

	stack<char> sta1;	//커서 왼쪽 문자열
	stack<char> sta2;	//오른쪽 문자열

	for (int i = 0; i < len; i++)
		sta1.push(str[i]);	//입력받은 글자 push

	while (n--)
	{
		string cmd;
		cin >> cmd;
		if (cmd == "L")
		{
			if (sta1.empty())
				continue;
			else
			{
				sta2.push(sta1.top());
				sta1.pop();
				len--; //왼쪽 문자열 줄고
				len2++;	//오른쪽 문자열 늘어남
			}
		}
		else if (cmd == "D")
		{
			if (sta2.empty())
				continue;
			else
			{
				sta1.push(sta2.top());
				sta2.pop();
				len++; //왼쪽 문자열 늘고
				len2--;	//오른쪽 문자열 줄어듬
			}
		}
		else if (cmd == "B")
		{
			if (sta1.empty())
				continue;
			else
			{
				sta1.pop();
				len--;
			}
		}
		else if (cmd == "P")
		{
			char ch;
			cin >> ch;
			sta1.push(ch);
			len++;
		}
	}

	while (len > 0) //왼쪽 스택의 문자열을 오른쪽 스택으로 옮김
	{				//LIFO 성질 때문에
		sta2.push(sta1.top());
		sta1.pop();
		len--;
	}


	while (!sta2.empty())
	{
		cout << sta2.top();
		sta2.pop();
	}

	cout << '\n';


	return 0;
}

알고 보니 굳이 문자열의 길이 상관없이 empty()로 while문의 조건을 만들 수 있었다. 그렇게 하면 변수로 의한 메모리 낭비를 줄일 수 있을 것으로 생각된다.

Comments