BOJ

백준 1918 - 후위표기식

yanJuicy 2019. 6. 10. 05:02
반응형

문제

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

 

1918번: 후위표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식은 주어지지 않는다. 표기식은 알파벳 대문자와 +, -, *, /, (, )로만 이루어져 있으며, 길이는 100을 넘지 않는다. 

www.acmicpc.net

 

풀이

중위 표기식을 후위 표기식으로 바꾸는 문제이다. 스택을 이용하는 대표적인 문제이다. 식에 존재하는 연산자는 + - * / 인데 * / 가 + - 보다 우선순위가 높다. 그리고 같은 우선순위라면 먼저 나오는게 더 우선순위가 높게 된다. 이 점을 이용하여 알고리즘을 만든다. 

 

1. 중위표기식에 하나씩 접근하면서 피연산자를 만나면 바로 출력한다.

2. 연산자를 만나면 스택에 추가한다. 스택에 추가할 때 스택의 top이 넣을 연산자보다 우선순위가 높으면 스택을 pop 해주고 push 해준다.

3. ')'를 만나면 '(' 전까지 있는 모든 연산자를 스택에서 pop 한다.

4. 중위표기식을 모두 검사한 후에 스택에 남아있는 연산자를 pop 한다.

 

코드

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <stack>
#include <string>
 
using namespace std;
 
stack<char> s;
string inorder;
 
// 연산자의 우선순위
int getPriority(char ch)
{
    switch (ch)
    {
    case '*'case '/':
        return 2;
    case '+'case '-':
        return 1;
    case '('case ')':
        return 0;
    default:
        return -1;
    }
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> inorder;
 
    for (int i = 0; i < inorder.size(); i++)
    {
        char ch = inorder[i];
 
        // 연산자가 아니면 바로 출력
        if (ch >= 'A' && ch <= 'Z'cout << ch;
        else    // 연산자일 경우
        {
            // 스택에 연산자가 없거나 '(' 는 바로 넣어준다.
            if (s.empty() || ch == '(') s.push(ch);
            else
            {
                // 자기 보다 높은 우선순위 위에 push 할 수 없으므로 높은 우선순위를 pop한다.
                while (getPriority(ch) <= getPriority(s.top()))
                {
                    // ')'일 경우 '('까지만 실행해야한다. 중위 표기에서 ()사이에 연산자들만 pop함
                    if (s.top() == '(')
                    {
                        s.pop();
                        break;
                    }
                    // 높은 우선순위에 연산자들 출력
                    cout << s.top();
                    s.pop();
                    if (s.empty()) break;
                }
                // ')' 일 경우 '(' 사이에 있는 연산자들을 출력하고 없어져야한다.
                if (ch != ')') s.push(ch);
            }
        }
    }
 
    // 스택에 남아있는 연산자들 출력
    while (!s.empty())
    {
        cout << s.top();
        s.pop();
    }
 
    return 0;
}
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 2294 - 동전 2  (0) 2019.06.24
백준 1935 - 후위표기식2  (0) 2019.06.11
백준 2104 - 부분배열 고르기  (0) 2019.06.08
백준 1904 - 01타일  (0) 2019.06.05
백준 1700 - 멀티탭 스케줄링  (0) 2019.06.03