괄호 안에 괄호가 있다면 값을 곱해주는 형태로 계산이 되는데
(()[[]]) 이 경우 안의 괄호 ()[[]]는 2+3x3 총 (()[[]]) 이 괄호는 2x(2+3x3) 형태로 계산된다. 이 수식을 분배법칙을 활용하여 2x2 + 2x3x3으로 바꿀 수 있다.
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
//분배법칙 활용
//백준 2504, 괄호의 값
int main(){
std::string s;
std::stack<char> stack;
int tmp{1};
int ans{0};
std::cin >> s;
for(int i{0}; i<s.size(); ++i){
if(s[i] == '(') {
stack.push('(');
tmp*=2;
}
else if(s[i] == '['){
stack.push('[');
tmp *= 3;
}
else if(s[i] == ')'){ //닫힌 괄호를 만났을 때
if(stack.empty() || stack.top() != '('){
std::cout << 0;
return 0;
}
else if(s[i-1] == '(') ans += tmp;
stack.pop();
tmp /= 2;
}
else if(s[i] == ']'){
if(stack.empty() || stack.top() != '['){
std::cout << 0;
return 0;
}
else if(s[i-1] == '[') ans += tmp;
tmp/=3;
stack.pop();
}
}
if(!stack.empty()) ans=0;
std::cout << ans;
return 0;
}