본문 바로가기

백준/실버

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

문제링크 : https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

double arr[26];
stack<double>st;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    int N; string s;
    cin >> N >> s;
    for(int i=0; i<N; i++)
    {
        cin >> arr[i];
    }

    for(int i=0; i<s.size(); i++)
    {
        if(s[i] >= 'A' && s[i] <= 'Z') //알파벳에 대응하는 수 푸쉬
        {
            st.push(arr[s[i]-'A']);
        }
        else
        {
            double op1, op2;
            op1 = st.top(); st.pop(); //연산할 첫번째 수
            op2 = st.top(); st.pop(); //연산할 두번째 수
        
            if(s[i] == '+') //계산순서 주의
            {
                st.push(op2 + op1);
            }
            else if(s[i] == '-')
            {
                st.push(op2 - op1);
            }
            else if(s[i] == '*')
            {
                st.push(op2 * op1);
            }
            else if(s[i] == '/')
            {
                st.push(op2 / op1);
            }
        }
    }
    cout.precision(2);
    cout << fixed << st.top();
    return 0;
}

알파벳에 대응하는 수로 전환하여 스택에 수만 따로 저장해준다.

이후 각 사칙연산에 따라서 계산을 해주면 된다.

계산을 위해 스택의 맨 앞 수 2개가 필요하므로 미리 따로 저장하고 pop까지 해준다. (op1, op2)

 

각 사칙연산에 따라서 계산한 수를 다시 스택에 넣어 문자열 s의 길이만큼 반복해준다.

계산할 때 주의해야 할 것이 op1, op2의 계산 순서이다.

처음에 op1, op2 이렇게 순서대로 스택의 top()을 지정해주었으나 실 계산 순서는 op2, op1이기에 이를 주의해야 한다.

 

계산하고 나서 다시 스택에 푸쉬하기에 최종 계산이 마친 숫자 또한 top()에 있으므로 모든 계산을 마치고 top()을 출력해주면 된다.

 

처음에 double이 아닌 float로 했다가 여러번 틀렸다.

찾아보니 정밀도가 float보다 double이 높은데 이를 거꾸로 알고 있어서 float를 썼다가 틀린 것이 었다.

(해당 문제 입력 20억 -> 10자리)  [float : 6자리 / double : 15자리]