문제

문제 링크

문제 접근

  • 이 문제는 후위 순회를 떠올려서 처음에는 트리를 이용하려고 했으나 생각해보니 연산자를 만났을 때 그 전의 연산된 두 수를 연산해주기만 하며 된다.
  • 이를 위해 스택을 사용했다.

코드

#include <cstdio>
#include <stack>
using namespace std;
int arr[101], n, cnt;
char s[101];
int main(){
    scanf("%d", &n);
    scanf("%s", s);
    stack<double> st;
    for(int i = 0; i < n; i++)scanf("%d", &arr[i]);
    for(int i = 0; s[i] != '\0'; i++){
        char c = s[i];
        if(c <= 'Z' && c >= 'A')st.push(arr[c-'A']);
        else {
            double y = st.top(); st.pop();
            double x = st.top(); st.pop();
            if(c == '*')st.push(x*y);
            else if(c == '+')st.push(x+y);
            else if(c == '-')st.push(x-y);
            else st.push(x/y);
        }
    }
    printf("%.2f", st.top());
}

느낀점

  • 문제를 보고 폭넓은 접근방법을 떠올리도록 단어에 대한 선입견은 내려놓자!