백준 [1918] "후위 표기식"

Kimbab1004·2024년 4월 13일
0

Algorithm

목록 보기
31/102

연산자 끼리의 우선순위를 파악하고 우선순위가 낮은 연산자보다 높은 연산자가 뒤에 있을 확률이 있으니 뒤에 있는 연산자까지 파악하고 만약 뒤에 높은 연산자가 있을시 출력해야 했다. 그렇기에 LIFO형태인 Stack을 사용하는 것이 유리했다.
하지만 지금까지 대부분 PS 문제를 Deque로 해결하는데 익숙해져 있어서 Stack을 사용하지 않았다. Deque가 만능인 것은 분명하지만 시간 복잡도 에서 Priority Queue보다 느리고 Stack보다도 느리기 때문에 사용하는 것은 바람직하지 않다. 하루빨리 여러 방법을 사용하는 것에 익숙해져야 할 것 같다.

오답

#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>

using namespace std;
string v;
stack<char> s;

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

    cin >> v;
    for (int i = 0; i < v.size(); i++) {
        if (v[i] != '+' || v[i] != '-' || v[i] != '*' || v[i] != '/' || v[i] != '(' || v[i] != ')') {
            cout << v[i];

        }
        else if (v[i] == '(') {
            while (v[i] == ')') {
                if (v[i] != '+' || v[i] != '-' || v[i] != '*' || v[i] != '/' || v[i] != '(' || v[i] != ')') {
                    cout << v[i];
                }
                else {
                    s.push(v[i]);
                    i++;
                }
            }
            while (!s.empty()) {
                cout << s.top();
                s.pop();
            }
        }
        else if (v[i] == '+' || v[i] == '-' || v[i] == '*' || v[i] == '/') {
            s.push(v[i]);
        }
    }
    return 0;
}

정답

#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    string s;
    stack<char> sc;
    cin >> s;

    for (int i = 0; i < s.length(); i++) {
        if (s[i] >= 'A' && s[i] <= 'Z') {
            cout << s[i];
        }
        else {
            if (s[i] == '(') {
                sc.push(s[i]);
            }

            else if (s[i] == '+' || s[i] == '-') {
                while (!sc.empty() && sc.top() != '(') {
                    cout << sc.top();
                    sc.pop();
                }
                sc.push(s[i]);
            }
            else if (s[i] == '*' || s[i] == '/') {
                while (!sc.empty() && (sc.top() == '*' || sc.top() == '/')) {
                    cout << sc.top();
                    sc.pop();
                }
                sc.push(s[i]);
            }
            else if (s[i] == ')') {
                while (!sc.empty() && sc.top() != '(') {
                    cout << sc.top();
                    sc.pop();
                }
                sc.pop();
            }
        }
    }

    while (!sc.empty()) {
        cout << sc.top();
        sc.pop();
    }

    return 0;
}

0개의 댓글