백준 1935: 후위 표기식2(C++)

maroo·2023년 4월 24일
0

BOJ

목록 보기
2/5
post-custom-banner

생각 흐름

stack을 이용한다.
피연산자는 push하고, 연산자가 나오면 2개를 pop해 계산한 결과값을 push한다.
최종 stack에 남은 1개의 값이 결과값이다.

초기 코드

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int N; cin >> N;
    string cmd; cin >> cmd;

    //수식에 입력 집어넣기
    char num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        replace(cmd.begin(), cmd.end(), (char)(i + 65), num);
    }

    //계산
    stack<double> stk;
    for (int i = 0; i < cmd.size(); i++) {
        double A, B;
        //연산자 나오면 2개 pop해 계산해서 결과값 push 
        if (cmd[i] == '+') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A  + B);
        }
        else if (cmd[i] == '-') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A-B);
        }
        else if (cmd[i] == '*') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A* B);
        }
        else if (cmd[i] == '/') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A/B);
        }
        else { //피연산자는 push. 다만 char를 double로 바꿔서
            stk.push(double(cmd[i] - '0'));
        }
    }
    cout << fixed; cout.precision(2);
    cout << stk.top();
    return 0;
}

오류: 틀렸습니다

간과한 점: char는 오로지 1자리 값만 받는다.
10을 입력받는다면 1만 char에 저장된다.
-->수식에 입력을 치환해 놓지 말고, 알파벳 값이 들어오면 그때 상응하는 값으로 바꾸자!

최종 코드:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int N; cin >> N;
    string cmd; cin >> cmd; //수식 받기

    //입력 숫자 받기
    vector<int> num; int n;
    for (int i = 0; i < N; i++) {
        cin >> n;
        num.push_back(n);
    }

    //계산
    stack<double> stk;
    for (int i = 0; i < cmd.size(); i++) {
        double A, B;
        //연산자 나오면 2개 pop해 계산해서 결과값 push 
        if (cmd[i] == '+') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A + B);
        }
        else if (cmd[i] == '-') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A - B);
        }
        else if (cmd[i] == '*') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A * B);
        }
        else if (cmd[i] == '/') {
            B = stk.top(); stk.pop();
            A = stk.top(); stk.pop();
            stk.push(A / B);
        }
        else { //피연산자는 push
            stk.push(double(num[int(cmd[i] - 65)]));
        }
    }
    cout << fixed; cout.precision(2);
    cout << stk.top();
    return 0;
}

도움되었던 입력과 출력

input
3
ABC++
10
20
30
output
60.00

profile
할수이따 ~
post-custom-banner

0개의 댓글