본문 바로가기

PS_Baekjoon

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

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

풀이 :
- <> 밖에 있는 단어만 뒤집어서 출력할 것
- flag를 세워서 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로 변경
            }
        }
    }
}