알고리즘/BOJ
백준 17413번 단어 뒤집기 2
lheunoia
2021. 4. 18. 12:09
문제 보러가기 : https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
이번 문제는 문자열 문제였습니다.
태그 안팎의 단어를 꺼낼 때 각각 큐(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
반응형