백준 - 5397번 : 키로거 (C++)

RoundAbout·2024년 5월 20일
0

BaekJoon

목록 보기
69/90

풀이 방법 : 스택

결국 커서의 위치를 잘 파악하는게 가장 중요한 문제 커서를 중심으로 왼쪽부분, 오른쪽 부분으로 나눠서 문제에서 요구하는 연산들을 수행하는게 편할 것이다. 중간 삽입 삭제가 빈번할 것이기 때문에 링크드 리스트를 이용해서 푸는 것도 가능할 것이다.

  1. 왼쪽부분, 오른쪽 부분을 담당할 스택 두 개를 만들어두고 문자가 들어오면 왼쪽 스택에 push 해준다.

  1. '<' 연산자가 들어오면 왼쪽 부분 스택에서 요소를 뽑아내 오른쪽 스택에 push해준다.

  1. '>' 연산자가 들어오면 오른쪽 부분 스택에서 뽑아내 왼쪽 스택에 push해준다.

  1. 1~3번 과정을 하면 왼쪽 스택에서 pop하면 나오는 요소는 커서의 바로 앞의 요소와 동일하다. 따라서 '-'연산자가 들어오면 왼쪽 스택에서 pop해주면 된다.

  1. 입력으로 주어진 모든 키를 처리했으면 오른쪽 스택에 남은 문자들을 왼쪽으로 다 옮겨준 뒤 왼쪽 스택에 모인 문자들을 모아서 역방향으로 출력해주면 암호가 완성된다.
#include <iostream>
#include <stack>

using namespace std;

int main()
{
	cin.tie(nullptr);
	cout.tie(nullptr);
	ios::sync_with_stdio(false);
	
	int T;
	cin >> T;

	while (T > 0)
	{
		--T;
		string Key;
		cin >> Key;
		
		stack<char> Left;
		stack<char> Right;

		int Length = Key.length();

		for (int i = 0; i < Length; ++i)
		{
			if (Key[i] == '<')
			{
				if (!Left.empty())
				{
					char K = Left.top();
					Left.pop();
					Right.push(K);
				}
			}

			else if (Key[i] == '>')
			{
				if (!Right.empty())
				{
					char K = Right.top();
					Right.pop();
					Left.push(K);
				}
			}

			else if (Key[i] == '-')
			{
				if(!Left.empty())
					Left.pop();
			}

			else
			{
				Left.push(Key[i]);
			}
		}

		while (!Right.empty())
		{
			char K = Right.top();
			Right.pop();
			Left.push(K);
		}

		string Pass;
		while (!Left.empty())
		{
			char K = Left.top();
			Left.pop();
			Pass += K;
		}

		int PassLength = Pass.length();

		for (int i = PassLength - 1; i >= 0; --i)
			cout << Pass[i];

		cout << '\n';

	}
}

profile
게임하고 피자 좋아함

0개의 댓글

관련 채용 정보