빠르게 푸는 연습을 해야하는데 쉽지않다.
풀이 방법은 다음과 같다.
코드는 아래와 같다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int candidate[102];
int visit[102];
vector<vector<int>> op_set;
void combination(int n, int depth, const vector<int> &op)
{
if(n == depth) {
vector<int> tmp;
for(int i=0;i<depth;i++)
tmp.push_back(op[candidate[i]]);
op_set.push_back(tmp);
return;
}
for(int i=0;i<n;i++) {
if(visit[i] == 1)
continue;
visit[i] = 1;
candidate[depth] = i;
combination(n, depth + 1, op);
visit[i] = 0;
}
}
long long solution(string expression) {
long long answer = 0;
int unique[3] = { 0, 0, 0 };
map<char, int> m;
m['+'] = 0; m['*'] = 1; m['-'] = 2;
string tmp = "";
vector<long long> num;
vector<int> op;
for(auto it : expression) {
if(isdigit(it)) {
tmp += it;
} else {
int idx = m[it];
num.push_back(stoi(tmp));
num.push_back(idx);
if(unique[idx] == 0) {
op.push_back(idx);
unique[idx] = 1;
}
tmp = "";
}
}
num.push_back(stoi(tmp));
combination(op.size(), 0, op);
for(auto it : op_set) {
vector<long long> init_num(num.begin(), num.end());
for(int i=0;i<it.size();i++) {
for(int j=0;j<init_num.size();j++) {
if((j & 1) && init_num[j] == it[i]) {
long long new_num;
if(it[i] == 0)
new_num = init_num[j - 1] + init_num[j + 1];
else if(it[i] == 1)
new_num = init_num[j - 1] * init_num[j + 1];
else
new_num = init_num[j - 1] - init_num[j + 1];
init_num.insert(init_num.begin() + j - 1, new_num);
for(int k=0;k<3;k++)
init_num.erase(init_num.begin() + j);
j--;
}
}
}
answer = max(abs(init_num[0]), answer);
}
return answer;
}