Programing/백준, 프로그래머스(C++)

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

hye3193 2025. 1. 2. 20:32

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

제출 코드

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

void coutWord(vector<char> &word)
{
    for (int i = word.size() - 1; i > -1; i--)
    {
        cout << word[i];
        word.pop_back();
    }
}

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

    string str;
    vector<char> word;
    bool inTag = false;
    char pastWord = 0;

    getline(cin, str);

    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] == '<')
        {
            if (pastWord == 'w') cout << ' ';
            coutWord(word);
            inTag = true;
        }
        if (inTag)
        {
            cout << str[i];
            if (str[i] == '>')
            {
                inTag = false;
                pastWord = 't';
            }
            continue;
        }

        if (str[i] == ' ')
        {
            if (pastWord == 'w') cout << ' ';
            coutWord(word);
            pastWord = 'w';
            continue;
        }
        else if (i == str.length() - 1)
        {
            if (pastWord == 'w') cout << ' ';
            word.push_back(str[i]);
            coutWord(word);
            return 0;
        }
        word.push_back(str[i]);
    }
}

공백을 포함하여 입력받기 위해 getline 함수를 사용했다

우선 이번 문자가 <인지 확인하여 태그 속에 있는지 확인하고, 태그 속에 있다면 > 문자가 나올 때까지 들어온 문자를 그대로 출력해 준다

 

만약 태그 속이 아니라면 문자를 차례대로 vector에 추가하다가, 다음 문자가 ' '(공백)이거나 '<'이거나, 문자열의 끝인 경우 지금까지 추가된 문자들을 역순으로 출력하는 함수를 실행시켜 주었다

 

coutWord 함수에서는 역순으로 문자들을 출력하며 출력 후 pop 해준다

 

vector를 사용해서 코드를 작성했는데, stack을 사용하는 게 좀 더 정석적인 것 같다

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

void coutWord(stack<char> &word)
{
    while (!word.empty())
    {
        cout << word.top();
        word.pop();
    }
}

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

    string str;
    stack<char> word;
    bool inTag = false;
    char pastWord = 0;

    getline(cin, str);

    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] == '<')
        {
            if (pastWord == 'w') cout << ' ';
            coutWord(word);
            inTag = true;
        }
        if (inTag)
        {
            cout << str[i];
            if (str[i] == '>')
            {
                inTag = false;
                pastWord = 't';
            }
            continue;
        }

        if (str[i] == ' ')
        {
            if (pastWord == 'w') cout << ' ';
            coutWord(word);
            pastWord = 'w';
            continue;
        }
        else if (i == str.length() - 1)
        {
            if (pastWord == 'w') cout << ' ';
            word.push(str[i]);
            coutWord(word);
            return 0;
        }
        word.push(str[i]);
    }
}

vector -> stack으로 변경