🤓 스터디/💻 컴퓨터 알고리즘
[ 백준 BOJ / c++ ] 5397번 키로거
Mr.Baobab
2025. 2. 3. 11:34
반응형
🤔 문제
링크 : https://www.acmicpc.net/problem/5397
👀 접근 방식
2개의 스택을 활용해 "<" , ">" , "-" 문자에 대한 명령을 아래와 같이 수행하는 것으로 방향을 잡았다.
- '<' 일때, 스택1의 top값을 스택2로 옮긴다. ( 스택1이 비어있지 않을시 )
- '>' 일때, 스택2의 top값을 스택1로 옮긴다. ( 스택2이 비어있지 않을시 )
- '-' 일때, 스택1의 top값을 pop을 사용해 제거한다. ( 스택1이 비어있지 않을시 )
이후 각 스택에 담긴 문자를 문자열로 바꾸는 작업을 진행한다. 이때 스택1의 문자는 reverse함수를 사용에 뒤집어 주었다.
💻 코드
#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;
}
반응형