https://www.acmicpc.net/problem/5397
#include <iostream>
#include <stack>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t;
cin >> t;
for (int test = 0; test < t; test++) {
string s;
string ans;
cin >> s;
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '<') {
if (!ans.empty()) {
st.push(ans.back());
ans.pop_back();
}
}
else if (s[i] == '>') {
if (!st.empty()) {
ans.push_back(st.top());
st.pop();
}
}
else if (s[i] == '-') {
if (!ans.empty()) {
ans.pop_back();
}
} else {
ans.push_back(s[i]);
}
}
while (!st.empty()) {
ans.push_back(st.top());
st.pop();
}
cout << ans << "\n";
}
return 0;
}
1. 문제
테스트 케이스의 수 t와 그 수만큼의 문자열이 주어진다. <는 키보드의 왼쪽, >는 오른쪽, -는 백스페이스라 할 때, 실제로 작성되는 문자를 출력하는 문제이다.
2. 풀이
if (s[i] == '<') {
if (!ans.empty()) {
st.push(ans.back());
ans.pop_back();
}
}
왼쪽 방향키를 입력했을 경우 뒤에서부터 적용되고, 오른쪽 방향키를 누를 경우 앞에서부터 적용되므로 스택을 이용한다. 왼쪽 방향키를 입력했을 경우 이를 스택에 저장한다. 그 후, 순서를 위해 ans 배열의 맨 뒤를 없앤다.
else if (s[i] == '>') {
if (!st.empty()) {
ans.push_back(st.top());
st.pop();
}
}
오른쪽 방향키를 입력했을 경우 왼쪽 방향키를 눌러서 스택에 넣은 것을 다시 꺼내어 ans 배열에 넣는다.
else if (s[i] == '-') {
if (!ans.empty()) {
ans.pop_back();
}
}
백스페이스를 입력받았을 경우 해당 문자(커서 바로 앞의 문자)를 지운다.
else {
ans.push_back(s[i]);
}
문자를 입력받았을 경우 이를 추가한다.
while (!st.empty()) {
ans.push_back(st.top());
st.pop();
}
연산이 끝난 후 커서 뒤의 문자는 지워진 것이 아니므로 이를 차례로 꺼내어 ans 배열에 저장한다. 이를 출력하면 정답을 구할 수 있다.
'Coding Test' 카테고리의 다른 글
백준 1927 최소 힙 (0) | 2024.06.20 |
---|---|
백준 5430 AC (0) | 2024.06.19 |
백준 22942 데이터 체커 (0) | 2024.06.17 |
백준 2493 탑 (1) | 2024.06.16 |
백준 2504 괄호의 값 (1) | 2024.06.15 |