본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 17413번 : 단어 뒤집기 2

반응형

www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

stack이용한 구현문제였습니다.

 

풀이방법

3가지 경우에 단어가 stack에서 빠져나옵니다.

 1. 현재 보는 문자가 '<'인 경우

 2. '>'인 경우

 3. '공백' 또는 마지막 문자인 경우

 

1.의 경우 stack에 들어있는 문자들이 tag인 경우는 없으므로 ('<'와 '>'가 번갈아 나오기 때문) 모두 뽑아 ans에 붙여줍니다.

 

2. '<'가 나왔는지 확인하는 flag를 두어 tag(flag = 1)라면 stack에서 '>'포함 모두 뽑아내고 다시 뒤집어주어 원래 단어가 나오게 한 다음 ans변수에 합쳐줍니다.

 

3. 공백이 있는지 여부를 확인하는 f를 두어 공백 제외하고 단어들을 뒤집어서 합쳐줍니다. 과중에서 공백이 나왔다면 f = 1로 만들어줍니다. 나중에 공백이 있었다면 정답에 공백을 넣어줍니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
string s, ans;
stack <char> st;
int main(){
    getline(cin,s);
    int flag = 0;
    for(int i = 0; i < s.size(); i++){
        if(s[i] != '<') st.push(s[i]);
        if(s[i] == '<') {
            while(!st.empty()) ans += st.top(), st.pop();
            st.push(s[i]);
            flag = 1;
        }
        else if(s[i] == '>'){
            string tmp;
            while(!st.empty()) tmp += st.top(),st.pop();
            if(flag) {
                flag = 0;
                reverse(tmp.begin(),tmp.end());
                ans += tmp;
            }
        }
        else if(s[i] == ' ' || i == s.size() - 1){
            if(!flag){
                int f = 0;
                string tmp;
                while(!st.empty()){
                    if(st.top()!= ' ') tmp += st.top();
                    else f = 1;
                    st.pop();
                }
                ans += tmp;
                if(f) ans += ' ';
            }    
        }
    }
    cout << ans << '\n';
}