ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 수식 최대화 c++
    알고리즘/프로그래머스 2022. 12. 21. 23:06
    반응형

    **

    프로그램 흐름도

    1. 숫자, 문자를 구분해 vector<string> rem 에 넣어준다.

    2. +,-,* 에 0,1,2 로 번호를 붙인 뒤 0,1,2 로 이루어진 순열 생성

    3. 순열 번호와 동일한 번호를 가진 연산자를 먼저 계산

    4. 최대값 갱신

     

    #include <string>
    #include <vector>
    #include <stack>
    #include <algorithm>
    #include <cmath>
    #include <iostream>
    using namespace std;
    
    string c[3] = {"-","*","+"};
    vector<int> v;
    vector<string> rem;
    stack<string> stk;
    
    void insertStr(string str) {
        string tmp = "";
        for(int i=0; i<str.length(); i++) {
            if(!isdigit(str[i])) {
                rem.push_back(tmp);
                if(str[i] == '-') { rem.push_back("-"); }
                else if(str[i] == '*') { rem.push_back("*"); }
                else if(str[i] == '+') { rem.push_back("+"); }
    
                tmp = "";
            }
            else { tmp = tmp + str[i]; }
        }
        
        rem.push_back(tmp);
    }
    
    long long calculateOperator(long long tmp1, long long tmp2, string op) {
        if(op == "-") { return tmp1 - tmp2; }
        else if(op == "*") { return tmp1 * tmp2; }
        else if(op == "+") { return tmp1 + tmp2; }
    }
    
    vector<string> calculate(string op) {
        vector<string> r;
        bool check[101] = {false,};
        
        for(int i=0; i<rem.size(); i++) {
            if(rem[i] == op) {
                long long tmp1 = stoll(stk.top());
                long long tmp2 = stoll(rem[i+1]);
            
                stk.push(to_string(calculateOperator(tmp1,tmp2,op)));
                
                r.pop_back();
                stk.pop();
                i++;
                r.push_back(stk.top());
            }
            else {
                stk.push(rem[i]);
                r.push_back(rem[i]);
            }
        }
        
        return r;
    }
    
    long long solution(string expression) {
        long long answer = 0;
        
        for(int i=0; i<3; i++) {
            v.push_back(i);
        }
        
        do {
            long long result = 0;
            insertStr(expression);
            
            for(int i=0; i<3; i++) {
                rem = calculate(c[v[i]]);
            }
            
            result = stoll(stk.top());
            stk.pop();
            
            if(abs(answer) < abs(result)) {
                answer = abs(result);
            }
            rem.clear();
        } while(next_permutation(v.begin(),v.end()));
        
        return answer;
    }

     

    728x90
    반응형

    댓글

Designed by Tistory.