백준 - 1406 에디터 솔루션

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

// 에디터_1406_백준

int main()
{
	// 0. 입출력 속도를 향상 시킨다.
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	// 1. 문자열을 입력 받는다
	string s; // 문자열
	cin >> s;

	// 2. 명령어의 개수를 입력 받는다.
	int M;
	cin >> M;

	// 3. 명령어를 처리한다.
	list<char> lst(s.begin(), s.end());
	list<char>::iterator cursor = lst.end();

	//string::size_type cursor = s.size() - 1;
	
	while (M--)
	{
		// 3-1. 명령어를 입력 받는다. 
		char op;
		cin >> op;

		// 3-2. 각 명령어에 맞게 실행한다.
		switch (op)
		{
		case'L':
			if (cursor != lst.begin())
			{
				--cursor;
			}
			
			break;
		case'D':
			if (cursor != lst.end())
			{
				++cursor;
			}
			
			break;
		case'B':
			// 문자를 지운 후 커서 위치 업데이트 필요함.
			if (cursor != lst.begin())
			{
				--cursor;
				cursor = lst.erase(cursor);
			}
	
			break;
		case'P':
			// 문자를 추가하기 전에 위치를 업데이트 해줘야 함.
			char param;
			cin >> param;

			cursor = lst.insert(cursor, param);
			cursor++;
	
			break;
		}
	}

	// 4. 출력
	for (list<char>::iterator iter = lst.begin(); iter != lst.end(); iter++)
	{
		cout << *iter;
	}
}

백준 - 5397 키로거 솔루션

#include <iostream>
#include <string>
#include <list>
#include <vector>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int TestCase;
	cin >> TestCase;
	while (TestCase--)
	{
		// 1. 문자열을 입력 받는다.
		string input;
		cin >> input;

		//for (char ch : input) { 컨테이너를 수정하면 안된다. -> 컨테이너에 데이터를 삭제, 삽입하면 안된다. }// 모든 문자열 순회

		// 2. 컨테이너 2개를 받는다
		// 2-1. 하나는 커서 왼편에 존재하는 문자열로 정방향으로 저장
		// 2-2. 다른 하나는 커서 오른편에 존재하는 문자열로 역방향으로 저장
		vector<char> left, rightReversed;

		// 3. 각 문자열을 적절하게 처리한다.
		// 알파벳 대소문자, 숫자, 백스페이스(-), 화살표(<>)
		for (char ch : input)
		{
			switch (ch)
			{
			case '<':
				if (false == left.empty())
				{
					rightReversed.push_back(left.back());
					left.pop_back();
				}
				break;
			case '>':
				if (false == rightReversed.empty())
				{
					left.push_back(rightReversed.back());
					rightReversed.pop_back();
				}
				break;
			case '-':
				if (false == left.empty())
				{
					left.pop_back();
				}
				break;
			default:
				left.push_back(ch);
				break;
			}
		}
	cout << string(left.begin(), left.end()) << string(rightReversed.rbegin(), rightReversed.rend()) << "\\n";
	}
}

스택

: 연산이 한 쪽 끝에서만 이뤄지는 자료구조


스택_10828_백준

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

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int stack[100000] = { 0 };
	int Wherecount = 0;
	// 1. 명령의 수 
	int input;
	cin >> input;

	// 2. 명령 입력	(1 <= M <= 100,000)

	for (int i = 0; i < input; i++)
	{
		int push_input;
		string command;
		cin >> command;

		if (command == "push")
		{
			cin >> push_input;
			stack[Wherecount] = push_input;
			Wherecount++;
		}
		else if (command == "pop")
		{
			if (stack[0] == NULL)
			{
				cout << "-1\\n";
			}
			else
			{
				cout << stack[Wherecount -1] << "\\n";
				stack[Wherecount-1] = NULL;
				Wherecount--;
			}
		}
		else if (command == "size")
		{
			cout << Wherecount << "\\n";
		}
		else if (command == "empty")
		{
			if (stack[0] == NULL)
			{
				cout << "1\\n";
			}
			else
			{
				cout << "0\\n";
			}
		}
		else if (command == "top")
		{
			if (stack[0] == NULL)
			{
				cout << "-1\\n";
			}
			else if(stack[Wherecount-1] != NULL)
			{
				cout << stack[Wherecount - 1] << "\\n";
			}
			
		}
	}
}

백준-제로-10773

#include <iostream>
#include <string>
using namespace std;
int Money[1000000] = { 0 };

// 숫자가 입력된다.
// 잘못된 숫자가 나오면 0을 입력하여 top 숫자를 지운다.
// 처음부터 끝까지의 총 합을 구하라.
// ex) 4(테스트 횟수) 3 -> 0(3지움) -> 4 -> 0(4지움) = 0 이 된다.
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	// 1. 반복할 횟수 K를 입력한다.
	int K;
	cin >> K;

	// 2. 배열 선언
	int Where = 0;		// 위치

	// 2-1. 돈 입력
	int InputMoney = 0; // 입력한 돈
	int sumMoney = 0;	// 다 더한 값

	// 2-2. 0을 카운트 해서 뒷부분에 0 있어도 count 더해짐
	int zeroCount = 0;

	// 3. 횟수 만큼 반복하는 반복문
	for (int i = 0; i < K; i++)
	{
		cin >> InputMoney;
		Money[Where] = InputMoney;
		Where++;
	}

	// 0 뒷 숫자들을 삭제

	for (int j = K - 1; j >= 0; j--)
	{
		if (Money[j] == 0)
		{
			zeroCount++;
		}

		else if (zeroCount > 0)
		{
			Money[j] = 0;
			zeroCount--;
		}
	}

	// 4. 더한값 출력 
	for (int i = 0; i < K; i++)
	{
		sumMoney += Money[i];
	}
	cout << sumMoney << "\\n";
}

백준_괄호_9012

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

// 0. 괄호 배열
string VPS;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	// 1. 입력 개수 (TestCase)
	int T = 0;
	cin >> T;

	// 1-1. 카운트

	// 개행문자 없애주는 애
	std::cin.ignore();

	for (int i = 0; i < T; i++)
	{
		int count1 = 0;
		int count2 = 0;
		bool a = false;
		std::getline(std::cin, VPS);

		for (int i = 0; i < VPS.size();++i)
		{
			if (VPS[i] == '(')
			{
				count1++;
			}
			else if (VPS[i] == ')')
			{
				count2++;
				if (count2 > count1)
				a = true;
			}
		}
		if (count1 == count2 && a == false)
		{
			cout << "YES\\n";
		}
		else
		{
			cout << "NO\\n";
		}
		
	}
}