문제 풀이/문제 풀이(BOJ)
[Silver III] 단어 뒤집기 2 -17413
풀뿌리
2024. 9. 6. 15:07
[문제 위치]
https://www.acmicpc.net/problem/17413
[문제 풀이]
스택을 활용하는 문제이다.
역순으로 출력하는 과정에서 스택의 후입선출을 활용하는 것이다.
구분점이 되는 '<' 과 ' ' 을 찾을 때까지 스택을 쌓다가 구분점을 찾으면 이전 스택에 쌓인 것들을 출력하면 된다.
'<' 와 '>' 사이에 있는 문자들은 역순이 아니므로 스택에 쌓지 않고 바로 출력하는 예외 처리를 해주어야 한다.
#include <iostream>
#include <stack>
#include <string>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
int main(void)
{
fastio;
stack<char> s;
string str;
int i = 0;
getline(cin, str);
while (str[i] != '\0')
{
if (str[i] == '<')//'<' 발견해서
{
while (!s.empty())//'<' 앞에 문자 있었는지 확인하고
{
cout << s.top();//해당 문자열 역순 출력
s.pop();
}
while (true)
{
cout << str[i];//'>' 찾을 때까지 괄호 안 정상 출력
if (str[i] == '>')//찾으면 종료
break;
i++;
}
}
else if (isalnum(str[i]))//알파벳이 아니라면
{
s.push(str[i]);//스택에 넣기
}
else//'<'도 아니고 알파벳도 아닌 경우(이 문제에서는 ' ' 공백
{
while (!s.empty())//공백 전에 쌓인거 출력
{
cout << s.top();
s.pop();
}
cout << " ";//한 칸 띄우기
}
i++;//증가
}
while (!s.empty())//마지막으로 문자열에 남은거 털기
{
cout << s.top();
s.pop();
}
}