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