본문 바로가기

알고리즘/BOJ

[C++] 백준 1935번 - 후위 표기식2


0. 문제

 

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

1. 아이디어

 

1) 후위 표기식 연산은, 앞에 먼저 피연산자 2개가 나오고 이어서 연산자가 나오는 구조이다.

그러니까 피연산자는 스택에 PUSH 하고, 연산자가 나오면 스택에서 POP을 2번 해서 계산하면 된다.

 

2) 알파벳으로 된 피연산자를 각각의 대응하는 값으로 바꿔서 계산해야 하는데 이를 위해 함수를 작성한다.

 

3) 또한, "+, -, *, /"의 연산자들을 만나서  계산하는 과정의 가독성을 높이기 위해서 함수를 작성한다.

 

4) 중간계산의 결과들은 다시 스택에 PUSH 하고 다음 연산의 피연산자로 사용한다.

 

5) 마지막으로 스택에 남아있는 하나가 최종 결과값이 된다!

 

2. 소스코드

 

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
#include <iostream>
#include <iomanip>
#include <stack>
double calculate(double num1, double num2, char oper)
{
    switch (oper) {
    case '+':
        return num1 + num2;
        break;
    case '-':
        return num1 - num2;
        break;
    case '*':
        return num1 * num2;
        break;
    case '/':
        return num1 / num2;
        break;
    }
}
int Change(char alphabet, int* num) //피연산자에 대응하는 숫자 return
{
    for (int i = 'A'; i <= 'Z'; i++)
        if (alphabet == i) return num[i - 'A'];
}
int main()
{
    int N;
    std::stack<double> st;
    std::string str;
    std::cin >> N >> str;
    int* num = new int[N];//피연산자에 대응하는 값들의 배열
    for (int i = 0; i < N; i++std::cin >> num[i]; //피연산자들의 값 입력
    for (int i = 0; i != str.length(); i++)
    {
        if (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/')
            st.push(Change(str[i], num));
        else
        {
            double num2 = st.top();
            st.pop();
            double num1 = st.top();
            st.pop();
            st.push(calculate(num1, num2, str[i]));
        }
    }
    double result = st.top();
    delete[] num;
    std::cout.precision(2);
    std::cout << std::fixed;
    std::cout << result;
cs

 

3. 결과

 

4. 피드백

 

  • 동적할당된 변수나 배열들을 DELETE 시켜주는 걸 잊지 말자.
  • C++에서 출력 형식 지정해주는 방법을 몰랐음.. 
  • 왜 float으로 하면 안 되는 거지?

TO DO LIST: C++ cout 조정자 출력 형식 지정