문제 설명

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

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

< > 안에 있는 단어는 그대로, 그렇지 않은 단어는 거꾸로 출력하는 문제

 

 

문제 풀이법

처음에는 띄어쓰기를 기준으로 단어의 첫 시작점과, 끝 시작점을 지정해서 reverse 시키려고 했다

하지만 너무 구현이 비효율적인 것 같았다

솔직히 스택을 사용하면 된다는 생각은 못하고 있었는데, 스택이라는 힌트를 봐버려서 스택으로 구현하게 되었다

 

여기서 한 번 틀렸는데 틀린 예제는 > 뒤에 문자열이 나왔을 때다

스택에 넣지않고 제대로 출력하는 문자는 flag를 통해 지정해주었고, <이면 flag == true, >이면 flag == false로 설정해주려고 했다

하지만 >인 경우는 내 의도대로 else if (str[i] == '>')를 타지않고, 바로 if (flag == true)를 타버리기 때문에
> 뒤에 나오는 문자열은 그냥 그대로 출력되는 문제가 발생했다

이 부분을 수정하니 정답이었다 

 

소스 코드

#include <iostream>
#include <algorithm>
#include <stack>


using namespace std;

stack<char> s;

void get_stack()
{
    while (!s.empty())
    {
        printf("%c",s.top());
        s.pop();
    }
}

int main()
{
    string str;
    
    getline(cin, str);
    bool flag = false;
    
    for(int i = 0; i < str.size(); i++)
    {
        if (flag == true)
        {
            if (str[i] == '>')
                flag = false;
            printf("%c", str[i]);
        }
        else if (str[i] == ' ')
        {
            get_stack();
            printf(" ");
        }
        else if (str[i] == '<')
        {
            get_stack();
            flag = true;
            printf("<");
        }
        else
            s.push(str[i]);
        
    }
    get_stack();
    return 0;
}
복사했습니다!