본문 바로가기
알고리즘/백준

[백준 17413] 단어 뒤집기 2

by RoJae 2021. 12. 19.

🚀  들어가며...

  • 스택을 사용하여 문제를 풀이하였다.
  • 모든 문자열을 뒤집는다. ("<", ">" 사이에 존재하는 문자열은 제외)
  • stack : 뒤집을 문자가 들어갈 공간
  • ans : 결과 문자열

 

🔗  문제

https://www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 

💌 소스코드

#include <iostream>
#include <stack>
#include <string>

using namespace std;

// 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
// 문자열의 시작과 끝은 공백이 아니다.
// '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.


int main(void){
	stack<char> stack;	// 뒤집힐 문자열이 들어가는 스택
    string str;
    string ans;
    bool isOpen = false;
    getline(cin,str);	// 문자 한 줄 입력
    
    for(int i=0; i<str.size(); i++){
    	char ch = str[i];
    	
		// "<"
		if(ch == '<'){
    		isOpen = true;    						
			
    		while(!stack.empty()){
				ans += stack.top();
				stack.pop();	
			}						
			
			ans += "<";
    	}
		// ">"
    	else if(ch == '>'){
    		isOpen = false;

			while(!stack.empty()){
    			ans += stack.top();
				stack.pop();	
			}
			
			ans += ">";
		}
		// " "
		else if(ch == ' '){
			while(!stack.empty()){
    			ans += stack.top();
				stack.pop();	
			}
			
			ans += " ";
		}
		// 일반 문자의 경우
		// "< >" 안에 있는 경우 뒤집지 않는다.
		// 괄호 밖에 있는 경우 뒤집는다.
		else{
			if(!isOpen)
				stack.push(str[i]);
			else
				ans += str[i];
		}
	}
	
	while(!stack.empty()){
		ans += stack.top();
		stack.pop();	
	}	
	
	cout << ans << endl;
	
}

 

 

 

 

댓글