https://www.acmicpc.net/problem/2504
구현, 스택
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
string input;
cin >> input;
stack<int> s;
int result = 0;
for (int i = 0; i < input.size(); i++)
{
char now = input[i];
if (now == '(')
{
s.push(-1);
}
else if (now == '[')
{
s.push(-2);
}
else if (now == ')' || now == ']')
{
bool isTwin = false; // 현재의 닫힌 괄호가 처리됐는지
// 스택 체크
int sum = 0;
while (!s.empty())
{
int top = s.top();
s.pop();
if (top == -1 || top == -2)
{ // 스택에서 여는 괄호를 만난 경우
if (top == -1 && now == ')') //(),(x)
{
if (sum == 0) //()
{
sum = 2;
}
else //(x)
{
sum = 2 * sum;
}
s.push(sum);
isTwin = true;
}
else if (top == -2 && now == ']') //[],[x]
{
if (sum == 0) //[]
{
sum = 3;
}
else //[x]
{
sum = 3 * sum;
}
s.push(sum);
isTwin = true;
}
else
{ // 괄호 짝이 안맞는 경우
cout << 0;
isTwin = false;
exit(0);
}
break;
}
else
{ // 스택에서 숫자를 만난 경우
sum += top;
}
}
if (!isTwin)
{ // 닫힌 괄호가 많은 경우
cout << 0;
exit(0);
}
}
}
while (!s.empty())
{
int top = s.top();
if (top == -1 || top == -2) // 열린 괄호가 많은 경우
{
cout << 0;
exit(0);
}
result += top;
s.pop();
}
cout << result;
}
( : 스택에 -1 넣음, [ : 스택에 -2 넣음
올바르지 않은 경우
닫힌 괄호를 만나는 순간 값을 계산해서 스택에 넣음
sum에 더함 : xy=x+y 처리sum=0인 경우 sum=2 or sum=3으로 바꿔주기, 스택에 push : ()=2, []=3 처리sum>0인 경우 sum*=2 or sum*=3, 스택에 push : (x)=2x, [x]=3x 처리