🤓 스터디/💻 컴퓨터 알고리즘

[ 백준 BOJ / c++ ] 5397번 키로거

Mr.Baobab 2025. 2. 3. 11:34
반응형

 

🤔 문제

 

링크 : https://www.acmicpc.net/problem/5397 

 


👀 접근 방식

2개의 스택을 활용해 "<" , ">" , "-" 문자에 대한 명령을 아래와 같이 수행하는 것으로 방향을 잡았다.

  1. '<' 일때, 스택1top값스택2로 옮긴다. ( 스택1이 비어있지 않을시 )
  2. '>' 일때, 스택2top값스택1로 옮긴다. ( 스택2이 비어있지 않을시 )
  3. '-' 일때, 스택1top값pop을 사용해 제거한다. ( 스택1이 비어있지 않을시 )

이후 각 스택에 담긴 문자문자열로 바꾸는 작업을 진행한다. 이때 스택1의 문자 reverse함수를 사용에 뒤집어 주었다.

1트만에 성공!


💻 코드

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

using namespace std;

void process()
{
	// 문자열 입력
	string input; cin >> input;

	// 두개의 스택 선언
	stack<char> sss1;
	stack<char> sss2;

	// 문자열의 각 문자에 대해 반복
	for (int i = 0; i < input.size(); ++i)
	{
		// i번째 문자를 c에 저장
		char c = input[i];

		// 문자가 '<' 일시
		if (c == '<')
		{
			// 스택1 이 비어있지 않으면, 스택1의 top값을 스택2로 옮김
			if (!sss1.empty())
			{
				char top = sss1.top();
				sss1.pop();
				sss2.push(top);
			}
		}
		// 문자가 '>' 일시
		else if (c == '>')
		{
			// 스택2 이 비어있지 않으면, 스택2의 top값을 스택1로 옮김
			if (!sss2.empty())
			{
				char top = sss2.top();
				sss2.pop();
				sss1.push(top);
			}
		}
		// 문자가 '-' 일시
		else if (c == '-')
		{
			// 스택1 이 비어있지 않으면, 스택1의 top값을 지움
			if (!sss1.empty())
			{
				sss1.pop();
			}
			
		}
		// 이외의 문자일시 스택 1에 더함
		else {
			sss1.push(c);
		}
	}

	//스택1의 문자를 문자열로 바꿈
	string str1 = "";

	while (!sss1.empty())
	{
		str1 += sss1.top();
		sss1.pop();
	}

	//스택2의 문자를 문자열로 바꿈
	string str2 = "";

	while (!sss2.empty())
	{
		str2 += sss2.top();
		sss2.pop();
	}

	// 스택1의 문자를 뒤집음
	reverse(str1.begin(), str1.end());

	//출력
	cout << str1 + str2 << '\n';
}

int main() {

	//테스트 케이스 입력받기
	int t; cin >> t;

	//테스트 케이스 만큼 process 실행
	while (t--)
	{
		process();
	}

	return 0;
}

 

반응형