⭐️ 완전탐색
set
로 연산자의 종류도 함께 파악next_permutation
사용vector
는 변동이 있으면 안되기 때문에 별도의 vector
에 복사vector
의 연산자가 동일하면 계산해주고 숫자 vector
에 결과 갱신하고 연산자 vector
도 갱신인덱스--
를 해줘서 이어서 탐색할 수 있도록 함for 문으로 값 추가하고 지워가는 방식이 비효율적이라고 생각했지만 인덱스 관리만 잘해준다면 자료형을 많이 쓰지 않고도 사용할 수 있었음
수식 연산이라고 무조건 stack
을 사용해야 하는 것은 아님
❗️ string
에서 long long
으로 형변환할 때 stoll
사용
❗️ 순열에는 조합 방식보다는 next_permutation
이 효율적
❗️ long long
관리 잘하기
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
vector<long long> num;
vector<char> ov;
long long calc(char ch, long long a, long long b) {
if(ch=='*') return (a*b);
else if(ch=='-') return (a-b);
else if(ch=='+') return (a+b);
}
long long sol(string str) {
vector<long long> new_num=num;
vector<char> new_ov=ov;
for(int i=0;i<str.size();i++) {
char ch=str[i];
int idx=0;
for(int j=0;j<new_ov.size();j++) {
if(ch==new_ov[j]) {
long long res=calc(ch,new_num[j],new_num[j+1]);
new_num[j]=res;
new_num.erase(new_num.begin()+(j+1));
new_ov.erase(new_ov.begin()+j);
j--;
}
}
}
return abs(new_num[0]);
}
long long solution(string expression) {
long long answer = 0;
// 연산자와 숫자 분리
string s="";
set<char> st;
for(int i=0;i<expression.size();i++) {
char ch=expression[i];
if(ch=='+' || ch=='*' || ch=='-') {
ov.push_back(ch);
st.insert(ch);
num.push_back(stoi(s));
s="";
}
else {
s+=expression[i];
}
}
num.push_back(stoll(s));
// 연산자 우선순위 정하기
vector<char> nov(st.begin(),st.end());
sort(nov.begin(),nov.end());
do {
string str="";
for(auto it=nov.begin();it!=nov.end();it++)
str+=*it;
answer=max(answer,sol(str));
} while(next_permutation(nov.begin(),nov.end()));
return answer;
}