์ค‘์œ„ ํ‘œ๊ธฐ์‹์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๊ณ ์น˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

๋งํฌ: https://www.acmicpc.net/problem/1918


์ค‘์œ„ ํ‘œ๊ธฐ์‹์„ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™„์„ฑ์‹œ์ผฐ๋‹ค. ์Šคํƒ๊ณผ switch case๋ฌธ์„ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

            // &๋ถ™์—ฌ์„œ ์ฃผ์†Œ๊ฐ’์— ๋ฐ”๋กœ ์ ‘๊ทผ
void endFormula(string& _result, stack<char>& _operator)
{
    while(!_operator.empty() && _operator.top() != '(')
    {
        _result += _operator.top();
        _operator.pop();
    }
    if(!_operator.empty() && _operator.top() == '(')
        _operator.pop();
    return;
}

void printOperate(string& _result, stack<char>& _operator)
{
    while(!_operator.empty())
    {
        if(_operator.top() != '(' && _operator.top() != ')')
            _result += _operator.top();
        _operator.pop();
    }
}

int precedence(char op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    return 0;
}

int main()
{
    string formula, result;
    stack<char> s_operator;

    cin >> formula;

    //size_t๋Š” ์ธ๋ฑ์Šค์šฉ์œผ๋กœ ๋งŽ์ด์“ฐ์ž„. ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค.
    for(size_t i = 0; i < formula.length(); ++i)
    {
        char c = formula[i];
        switch(c)
        {
            case '(':
                s_operator.push(c);
                break;

            case ')':
                endFormula(result, s_operator);
                break;

            case '+': case '-': case '*': case '/':
                while(!s_operator.empty() && s_operator.top() != '('
                      && precedence(s_operator.top()) >= precedence(c))
                {
                    result += s_operator.top();
                    s_operator.pop();
                }
                s_operator.push(c);
                break;

            default:
                result += c;
                break;
        }
    }

    printOperate(result, s_operator);

    cout << result << endl;
    return 0;
}

๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฌธ์ž์—ด์€ 1๋ฒˆ๋งŒ ์ˆœํšŒํ–ˆ๋‹ค. switch case๋ฌธ์œผ๋กœ ์ œ์ž‘ํ• ๋•Œ๋Š” ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ๋‘์—ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๊ด„ํ˜ธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ ์ผ๋‹จ, ๋ฌธ์ž์™€ ์—ฐ์‚ฐ์ž๋“ค์„ ๋ถ„๋ฆฌ์‹œ์ผœ๋†“๊ณ  ํ•˜๋‚˜์”ฉ ์Šคํƒ์—์„œ ๋นผ๋‚ด๋Š”๋ฐ ๋‹ซํžŒ ์ค‘๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ (๋‹จ, ์—ด๋ฆฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€!) ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์€ ๊ณ ๋ฏผ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฒ€์ƒ‰ํ–ˆ๋‹ค. precedence ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ + - * / ์ผ€์ด์Šค ๋‚ด๋ถ€์—์„œ ๋น„๊ตํ–ˆ๋‹ค. ๊ด„ํ˜ธ์—ฐ์‚ฐ์ž๊ฐ€ ๋น„๊ต๋Œ€์ƒ์— ์—†๊ณ , ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ํ˜„์žฌ ์—ฐ์‚ฐ์ž๊ฐ€ ์ด์ „ ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ํฌ๋ฉด result๋กœ ๋ฐ”๋กœ ๋„ฃ๋Š”๋‹ค. ์ด ์กฐ๊ฑด์— ์ถฉ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํƒ์— ๋‹ด๋Š”๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋งˆ์ง€๋ง‰์— printOperate๋กœ ๊ด„ํ˜ธ๋ฅผ ๋ฐฐ์ œ์‹œํ‚ค๊ณ  result์— ๋‹ด์•„์„œ ์ถœ๋ ฅํ–ˆ๋‹ค.