mojo's Blog
[백준 5397] 키로거 본문
문제 링크 => 5397번: 키로거 (acmicpc.net)
Stack을 활용한 문제이다.
Stack, Queue 관련 문제를 해결하다 보면 런타임에러가 종종 일어나기 마련인데 이번에도 한번에 패스하지 못했다.
일단, '<', '>' 와 같은 화살표로 커서를 움직여서 문자를 받아올때 해당 커서의 위치에서 문자가 들어오는게 핵심이다.
또한 '-' 와 같은 문자가 들어오는 경우, 커서의 왼쪽에 위치하는 문자를 제거해준다.
이때 내가 놓쳤던 부분은 '-' 를 받아올 때, pop을 하는 과정에서 예외처리를 신경써주지 못해 런타임에러가 발생하였다.
Stack s1, s2 2개를 활용하고 '<', '>' 와 같은 화살표와 '-' 가 들어올 때의 operation 은 다음과 같다.
(이때, s1은 최종 문자를 표현하기 위한 Stack이며 s2는 커서의 operation을 처리하기 위한 용도다)
'<' => s1에 담긴 문자를 s2에 옮기는 작업을 해준다.
'>' => s2에 담긴 문자를 s1에 옮기는 작업을 해준다.
'-' => s1에 담긴 문자를 pop 해준다.
그 외 => s1에 문자를 push 해준다.
모든 작업이 완료되면 커서가 중간에 배치될 경우에 대해서 커서 이후의 문자들을 담은 s2 를 s1에 전부 push 하고
s1 에 존재하는 모든 문자들을 string res="" 에다가 붙여주고 reverse 해준 그 결과가 답이다.
풀이 code
#define _CRT_SECURE_NO_WARNINGS
#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <time.h>
#define INF 100000000
#define endl '\n'
using namespace std;
void test() {
stack<char> s1;
stack<char> s2;
string str;
cin >> str;
for (int i = 0; i < str.size(); i++) {
char c = str[i];
if (c == '<') {
if (s1.size()) {
s2.push(s1.top());
s1.pop();
}
}
else if (c == '>') {
if (!s2.empty()) {
s1.push(s2.top());
s2.pop();
}
}
else if (c == '-') {
if(s1.size()) s1.pop();
}
else {
s1.push(c);
}
}
while (!s2.empty()) {
s1.push(s2.top());
s2.pop();
}
string res = "";
while (!s1.empty()) {
res += s1.top();
s1.pop();
}
reverse(res.begin(), res.end());
cout << res << endl;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t;
cin >> t;
for (int i = 0; i < t; i++) {
test();
}
return 0;
}
'백준 > Stack, Queue' 카테고리의 다른 글
[백준 1655] 가운데를 말해요 (0) | 2021.08.05 |
---|---|
[백준 11003] 최솟값 찾기 (0) | 2021.07.10 |
[백준 2504] 괄호의 값 (0) | 2021.07.01 |
Comments