문제 보러가기 : https://www.acmicpc.net/problem/17413
이번 문제는 문자열 문제였습니다.
태그 안팎의 단어를 꺼낼 때 각각 큐(queue)와 스택(stack) 자료구조를 사용하였습니다. 😀
《문제 풀이》
1. 공백을 포함하여 출력하기 위해 getline() 함수로 문자열 입력
2. 태그 안의 단어는 큐에 넣고, '>' 를 만나면 큐에 있는 모든 문자를 결과 문자열에 합함
3. 태그 밖의 단어는 스택에 넣고, '<'를 만나면 스택에 있는 모든 문자를 결과 문자열에 합함
4. 공백일 경우, 현재 tag가 true 인지 검사하고 2 또는 3 진행
5. 마지막으로 스택에 문자가 남아있는지 확인하고 결과 문자열에 합함
《C++ 코드》
#include <iostream>
#include <cstring>
#include <stack>
#include <queue>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
string s;
getline(cin, s);
string result; // 결과 문자열
stack<char> st; // 태그 밖의 단어 순서를 거꾸로 출력
queue<char> q; // 태그 안의 단어 순서를 그대로 출력
bool tag = false; // 태그 안팎 여부 검사
for (int i=0; i<s.length(); i++) {
if (s[i] == '<') { // 열린 태그이면
q.push('<');
tag = true;
while (!st.empty()) {
result += st.top(); // 스택에 있는 모든 문자 더해줌
st.pop();
}
} else if (s[i] == '>') { // 닫힌 태그이면
tag = false;
while (!q.empty()) {
result += q.front(); // 큐에 있는 모든 문자 더해줌
q.pop();
}
result += '>';
} else if (s[i] == ' ') {
if (tag) { // 태그 안의 공백이면
while (!q.empty()) {
result += q.front(); // 큐에 있는 모든 문자 더해줌
q.pop();
}
result += " ";
} else { // 태그 밖의 공백이면
while (!st.empty()) {
result += st.top(); // 스택에 있는 모든 문자 더해줌
st.pop();
}
result += " ";
}
} else {
if (tag) { // 태그 안의 문자이면
q.push(s[i]); // 큐에 삽입
} else { // 태그 밖의 문자이면
st.push(s[i]); // 스택에 삽입
}
}
}
// 스택에 남아있는 문자 출력
while (!st.empty()) {
result += st.top();
st.pop();
}
cout<<result;
return 0;
}
개발 환경: Visual Studio Code
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2583번 영역 구하기 (0) | 2021.04.14 |
---|---|
백준 2293번 동전 1 (0) | 2021.03.18 |
백준 1120번 문자열 (0) | 2021.03.07 |
백준 12852번 1로 만들기 2 (0) | 2021.03.01 |
백준 2263번 트리의 순회 (0) | 2021.02.25 |