알고리즘/백준

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

녕이 2022. 7. 19. 09:47
728x90

 

 

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

 

주어진 조건만 맞추면 되는 문제인데, 반례들을 생각하면서 조건을 챙기면서 구현해줘야 한다. 

<> 안의 문자열은 그대로 출력되어야 하므로

 

<가 나오면 flag 변수로 문자열을 그래도 추가

>가 나오면 flag 변수를 풀어주었다.

문자라면 tmp 문자열에 추가

빈칸이면 tmp 문자열 swap, tmp 문자열에 공백 추가

 

이렇게 하고, 더 생각해보자면

문자 뒤에 빈칸이 아니라 뒤에 <가 온다면 tmp 문자열을 ans에 넣어야 한다. 

입력받은 s 문자열을 모두 돌았는데 빈칸이나 <가 끝에 없다면 tmp 문자열에 넣었던 문자열을 ans에 넣을 수 없으므로 for문이 끝난 뒤, 

(입력 문자열 와 출력 문자열의 길이 다르면) 뒤에 tmp 문자열을 붙여준다.

 

 

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

string swapChar(string s){
    string tmp = s;
    for(int i=0; i<tmp.size()/2; i++){
        swap(tmp[i], tmp[tmp.size()-i-1]);
    }
    return tmp;
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    string s, ans;
    getline(cin, s);
    string tmp;
    bool flag = false;
    for(int i=0; i<s.size(); i++){
        if(s[i] == '<'){
            flag = true;
            ans += '<';
            tmp = "";
        }else if(s[i] == '>'){
            flag = false;
            ans += '>';
        }else{
            if(flag){ //괄호 열린 상태
                ans += s[i]; //그냥 문자 넣음
            }else{
                if(s[i] != ' '){ //문자
                    tmp += s[i];
                }else if(s[i] == ' '){ //빈칸
                    //뒤집기
                    ans += swapChar(tmp) + ' ';
                    tmp = "";
                }
                if(s[i+1] == '<') {
                    ans += swapChar(tmp);
                }
            }
        }
    }
    if(ans.size() != s.size()) ans += swapChar(tmp);
    cout << ans << '\n';
    return 0;
}

 

 

 

 

728x90