본문 바로가기

백준/실버

[백준 17413번] 단어 뒤집기 2 (C++)

문제링크 : https://www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

stack<char>st;

void func()
{
    while(!st.empty())
    {
        cout << st.top();
        st.pop();
    }
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    string s, result;
    getline(cin, s); //공백 포함 입력받기
    for(int i=0; i<s.size(); i++)
    {
        if(s[i]=='<')
        {
            func(); //< 전 뒤집힌 문자 출력
            while(s[i]!='>') //<> 사이 정상 출력
            {
                cout << s[i++];
            }
            cout << '>';
        }
        else if(s[i]==' ') 
        {
            func(); //공백 전 뒤집힌 문자 출력
            cout << " "; 
        }
        else //뒤집힌 문자 저장
        {
            st.push(s[i]);
        }
    }

    func(); //남아있는 문자 출력

    return 0;
}

문자열이 뒤집히는 경우가 있으므로 스택을 이용했다 (후입선출)

 

먼저 현재 문자가 '<' 일때는 정상적으로 출력되어야 하므로 다음 문자가 '>'가 나올 때까지 문자를 계속해서 출력시켜준다.

이때 문자의 인덱스를 이동시키는 값을 반복문에서 사용했던 i 그대로 사용해야 하는데,

이는 현재 출력된 값들은 앞으로 탐색할 필요가 없기 때문이다.

따라서 이를 위해 같은 인덱스인 i를 증가시켜서 이후 탐색에서 스킵되도록 해준다.

그리고 '<' 앞에 문자가 있을 수도 있으므로 이 경우 스택에 담아뒀던 문자를 출력해준다.

 

현재 문자가 " "일 경우도 비슷하다.

문자가 " ", 이나 <> 기준으로 뒤집히기에 현재 값이 " "일 때 마찬가지로 스택에 값이 있다면 스택에 담긴 문자를 출력해준다.

이후 " "은 이어서 출력해준다.

 

이외의 경우에 이제 뒤집히는 문자 밖에 안남았으므로 스택에 전부 저장해주면 된다.

 

마지막으로 " "이나 <> 이후에도 스택에 남아있는 문자가 있을 수 있기에 스택에 남아있는 문자가 있는 지 다시 한번 체크하고 있다면 출력해준다.