문제 풀이/문제 풀이(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();
	}
}