(Baijun) 제17413호: Upside down 2

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

17413호: 워드 리버스 2

문자열 S가 주어지면 이 문자열의 단어만 뒤집기를 원합니다.

첫째, 문자열 S는 다음 규칙을 따릅니다.

소문자(‘a’-‘z’), 숫자(‘0’-‘9’), 공백(‘ ‘) 및 특수 문자(‘<'、'>‘)구성.

www.acmicpc.net

해결책:
– <> 밖에 있는 단어만 역방향으로 표시
– true이고 비어 있지 않은 경우에만 단어를 복사하도록 플래그를 설정합니다.


– 빈칸이나 <가 나오면 복사한 단어가 거꾸로 인쇄됩니다.


– <가 나오면 flag를 false로 변경하여 그대로 출력,
– >가 나타나면 다시 true로 변경하고 다시 복사합니다.

암호:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main(){
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    string s, ans;
    bool check = true;

    getline(cin,s); //중간에 나오는 공백까지 다 입력받는 함수
    s(s.size()) = ' '; //마지막 단어까지 복사해서 출력하기 위해
    s += '\n'; //개행을 공백으로 바꾸고 개행을 다시 넣어줬다
    for(int i=0; i<s.size(); i++){
        if(check){ //check가 true일 떄
            if((s(i) >= '0' && s(i) <= '9') || (s(i) >= 'a' && s(i) <= 'z')){ //숫자거나 알파벳이라면
                ans += s(i); //복사한다
            }else{ //문자가 아니라면
                if(s(i) == '<'){ //<가 나오면 안의 문자는 바꾸면 안되기 때문에
                    check = false; //check의 값을 false로 변경
                }
                reverse(ans.begin(), ans.end()); //복사한 단어를 뒤집어주고 출력
                cout << ans;
                ans = ""; //초기화
                cout << s(i); //공백이나 <는 복사가 안됐기 때문에 출력해준다
            }
        }else{ //check가 false일 때 = 괄호 안이라는 것
            cout << s(i); //뒤집으면 안되니까 출력만 해준다
            if(s(i) == '>'){ //>가 나오면 다시 복사해야 하니까
                check = true; //check를 true로 변경
            }
        }
    }
}