https://programmers.co.kr/learn/courses/30/lessons/67257
#include <string>
#include <vector>
#include <set>
#include <iostream>
#define abs(x) x<0 ? -x:x
using namespace std;
string per; // 조합을 위한 문자열
vector<string> perS ={}; // 완성된 조합 set
bool check[4]= { false, }; // 방문 여부
vector<char>p; // 조합 elements
void permutation(int depth){ // n은 원하는 문자열 길이
if(depth == p.size()){
perS.push_back(per); // 완성된 조합 저장
return;
}
for(int i = 0; i < p.size(); i++){
if(!check[i]){
check[i] = true;
per[depth] = p[i]; // 현재 depth에 i번째 문자 저장
permutation(depth + 1); // 다음 depth에서 재귀 실행
check[i] = false; // 현재 depth에 쓰인 문자 풀어주기
}
}
}
long long solution(string expression) {
long long answer = 0;
vector<long long> num;
vector<char> exp;
set<char> check;
int idx = 0;
for(int i=1;i<expression.size();i++){
if(expression[i]-'0'<0 || expression[i]-'0'>10){
exp.push_back(expression[i]);
if(check.insert(expression[i]).second != false){
p.push_back(expression[i]);
per+="*";
}
num.push_back(stoi(expression.substr(idx, i-idx)));
idx = i+1;
}
if(i == expression.size()-1)
num.push_back(stoi(expression.substr(idx, i-idx+1)));
}
permutation(0);
for(int i=0;i<perS.size();i++){ // 모든 set
vector<long long> tempN(num);
vector<char> tempE(exp);
for(int j=0;j<p.size();j++){ // 각 연산에 대해
for(int k= 0;k<tempE.size();k++){ // 연산에 대해
if(tempE[k] == perS[i][j]){ // 그 연산이라면
long long n;
if(tempE[k] == '+'){
n = tempN[k]+tempN[k+1];
}else if(tempE[k] == '-'){
n = tempN[k]-tempN[k+1];
}else{
n = tempN[k]*tempN[k+1];
}
tempN[k] = n;
tempE.erase(tempE.begin()+k);
tempN.erase(tempN.begin()+k+1);
k--;
}
}
}
answer = max(answer, abs(tempN[0]));
}
return answer;
}
#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
long long solution(string expression) {
long long answer = 0;
set<char> s;
vector<char> all_op;
vector<char> op;
vector<long long> num;
string temp="";
for(int i=0;i<expression.length();i++) {
if(!isdigit(expression[i])) {
s.insert(expression[i]);
all_op.push_back(expression[i]);
num.push_back(stoi(temp));
temp="";
} else temp+=expression[i];
}
num.push_back(stoi(temp));
set<char>::iterator it;
for(it=s.begin();it!=s.end();it++) {
op.push_back(*it);
}
do {
vector<char> temp_op = all_op;
vector<long long> temp_num = num;
for(int i=0;i<op.size();i++) {
for(int j=0;j<temp_op.size();j++) {
if(temp_op[j]==op[i]) {
long long temp;
if(op[i]=='*') {
temp=temp_num[j]*temp_num[j+1];
i--;
} else if(op[i]=='+') {
temp=temp_num[j]+temp_num[j+1];
i--;
} else if(op[i]=='-') {
temp=temp_num[j]-temp_num[j+1];
i--;
}
temp_op.erase(temp_op.begin()+j);
temp_num.erase(temp_num.begin()+j, temp_num.begin()+j+2);
temp_num.insert(temp_num.begin()+j, temp);
}
}
}
if(answer<abs(temp_num.back())) {
answer=abs(temp_num.back());
}
} while(next_permutation(op.begin(), op.end()));
return answer;
}