백준

백준 1935번 C++ 배열 사용

solfa 2023. 7. 6. 16:08


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

#include <iostream>
#include <stack>
using namespace std;
stack<double> s;

int main()
{
    int n;
    string str;
    double tmp, arr[26];
    cin >> n >> str;

    for(int i = 0 ; i< n ; i++){
        cin>>arr[i];
    }
    
    for(int i = 0 ; i<str.length() ; i++){

        if (str[i] == '+')
        {
            tmp = s.top();
            s.pop();
            tmp = s.top() + tmp;
            s.pop();
            s.push(tmp);
        }
        else if (str[i] == '-')
        {
            tmp = s.top();
            s.pop();
            tmp = s.top() - tmp;
            s.pop();
            s.push(tmp);
        }
        else if (str[i] == '*')
        {
            tmp = s.top();
            s.pop();
            tmp = s.top() * tmp;
            s.pop();
            s.push(tmp);
        }
        else if (str[i] == '/')
        {
            tmp = s.top();
            s.pop();
            tmp = s.top() / tmp;
            s.pop();
            s.push(tmp);
        }
        else{
            int temp = str[i] - 'A';
            double num = arr[temp];
            s.push(num);
        }
    }
    cout << fixed;
    cout.precision(2);
    cout<<s.top();
}

 

vector가 아직 익숙하지 않아서 배열을 사용함



후위 표기식이란?

 - 연산자가 피연산자(숫자)뒤에 있는 표기식


후위 표기식의 장점

 - 괄호가 불필요함

 - 연산자의 우선 순위가 무의미함

 - 계산 과정이 간단함 (왼편에서 오른편으로 스캔, 그냥 쭉 계산하면 됨!)

ex) 중위 표기 - A/B-C+D*E-A*C 이거를 괄호를 묶어서 표현하면 (((A/B)+(D*E))-(A*C)) 이게 되는데

괄호 없이 바로 계산할 수 있게끔 식을 표기하는 것이 후위 표기!

후위 표기 : AB/C-DE*+AC*-



문제 푸는 포인트!

  • 스택을 활용하는데 표기식을 한 번에 다 받아와서 스택에 넣으면 안 됨 - 처음에는 피연산자를 두 개씩 받아와서(뒤와 동일하게 스택에 넣어서 빼면 되겠죠?) 연산자가 나오면 계산하고 그 값을 스택에 넣는 식임! 앞의 값을 계속 갱신해서 스택에 다시 넣어주는 식임!
  • 피연산자를 받을 경우 (위 코드에서 맨 마지막 else에 해당하는 경우) 입력식이 대문자 알파벳밖에 없으니까 A를 빼주면 A는 0, B는 1...... 이런 식으로 인덱스 순서 (배열 순서)를 쉽게 구할 수 있음
728x90

'백준' 카테고리의 다른 글

백준 1260번 C++ 배열 사용  (0) 2023.07.06
백준 4949번 c++  (0) 2023.07.06
백준 9012번 c++  (0) 2023.06.25
백준 2164 c++  (0) 2023.01.17
백준 10773번 C++  (1) 2023.01.17