알고리즘/프로그래머스

프로그래머스 수식 최대화 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
반응형