문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
문자열의 시작과 끝은 공백이 아니다.
'<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
사용 자료구조: 스택
- 문자를 하나씩 확인하면서 태그 안이면 그대로 출력, 태그 밖이면 뒤집어 출력한다
- 배운것! -> bool변수를 사용해서 현재 태그안인지 밖인지 keep in track한다
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// 스택에 있는 모든 문자를 출력해주는 함수
void Print(stack<char>& s)
{
while (!s.empty())
{
cout << s.top();
s.pop();
}
}
int main() {
// 문자열 입력받기
string input;
getline(cin, input);
stack<char> s;
// 해당 문자가 태그안인지 밖인지 확인해주는 변수
bool tag = false;
// 문자를 하나씩 확인하면서
for (char ch : input)
{
if (ch == '<')
{
// 태그 안
tag = true;
// 태그 앞에 오는 문자열 뒤집어 출력
Print(s);
cout << ch; // < 출력
}
else if (ch == '>')
{
// 태그 끝
tag = false;
cout << ch; // > 출력
}
// 태그 안에 있는 문자면
else if (tag)
{
cout << ch; // 그대로 출력
}
else
{
if (ch == ' ') // 태그 밖인데 공백을 보면 뒤접어 출력
{
Print(s);
cout << ch; // 공백 출력
}
else
s.push(ch); // 단어 스택에 넣기
}
}
Print(s); // 스택에 남아있는 문자 모두 출력
return 0;
}