문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
a
'-'z
'), 숫자('0
'-'9
'), 공백(' `'), 특수 문자('
<', '
>`')로만 이루어져 있다.<
'와 '>
'가 문자열에 있는 경우 번갈아가면서 등장하며, '<
'이 먼저 등장한다. 또, 두 문자의 개수는 같다.태그는 '<
'로 시작해서 '>
'로 끝나는 길이가 3 이상인 부분 문자열이고, '<
'와 '>
' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
#include <iostream>
#include <string>
#include <deque>
using namespace std;
int main()
{
string str;
getline(cin, str);
// < 이 등장하면 > 이 등장할 때 까지 삽입한다.
deque<char> dec;
while(!str.empty())
{
// < > 일 경우
if(str.front() == '<')
{
string temp = "";
while(!dec.empty())
{
temp += dec.back();
dec.pop_back();
}
cout << temp;
dec.push_back(str.front());
str.erase(str.begin());
while(str.front() != '>')
{
dec.push_back(str.front());
str.erase(str.begin());
}
dec.push_back(str.front());
str.erase(str.begin());
string tmp = "";
while(!dec.empty())
{
tmp += dec.front();
dec.pop_front();
}
cout << tmp;
}
else if(str.front() != ' ' && str.size() != 1)
{
dec.push_back(str.front());
str.erase(str.begin());
}
else if(str.front() == ' ')
{
string tmp = "";
while(!dec.empty())
{
tmp += dec.back();
dec.pop_back();
}
str.erase(str.begin());
cout << tmp << " ";
}
else if(str.size() == 1)
{
dec.push_back(str.front());
str.erase(str.begin());
string tmp = "";
while(!dec.empty())
{
tmp += dec.back();
dec.pop_back();
}
cout << tmp << endl;
break;
}
}
return 0;
}