코테준비 - Basic Calculator II

정상화·2023년 2월 26일

LeetCode

목록 보기
197/222

Basic Calculator II


class Solution {
public:
    int calculate(string s) {
        vector<string> degrees;
        unordered_map<char, function<int(int, int)>> plusMinus;
        unordered_map<char, function<int(int, int)>> mulDiv;
        plusMinus['+'] = [](int a, int b) { return a + b; };
        plusMinus['-'] = [](int a, int b) { return a - b; };
        mulDiv['*'] = [](int a, int b) { return a * b; };
        mulDiv['/'] = [](int a, int b) { return a / b; };

        for (auto it = s.begin(); it != s.end(); it++) {
            char letter = *it;
            if ('0' <= letter && letter <= '9') {
                degrees.push_back(parseNum(s, it));
            } else if (mulDiv.find(letter) != mulDiv.end()) {
                degrees.back() = to_string(mulDiv[letter](stoi(degrees.back()), stoi(parseNum(s, it))));
            } else if (plusMinus.find(letter) != plusMinus.end()) {
                string op = " ";
                op.at(0) = letter;
                degrees.push_back(op);
            }
        }

        int res = 0;
        char prevOp = '+';
        for (auto &degree: degrees) {
            if (plusMinus.find(degree.at(0)) != plusMinus.end()) {
                prevOp = degree.at(0);
            } else {
                res = plusMinus[prevOp](res, stoi(degree));
            }
        }
        return res;
    }

    string parseNum(string &s, string::iterator &it) {
        string numString = "";
        while (*it < '0' || *it > '9') {
            it++;
        }
        for (; next(it) != s.end() && *next(it) >= '0' && *next(it) <= '9'; it++) {
            numString += *it;
        }
        numString += *it;
        return numString;
    }
};
profile
백엔드 희망

0개의 댓글