https://www.acmicpc.net/problem/2504
스택, 구현
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
string input;
stack<int> s; //(:0, [:-1
int result = 0;
cin >> input;
for (int i = 0; i < input.size(); i++)
{
char c = input[i];
if (c == '(')
{
s.push(0);
}
else if (c == '[')
{
s.push(-1);
}
else if (!s.empty()) //), ]를 만나는 경우
{
if (c == ')' && s.top() == 0) //() -> 2로 치환
{
s.pop();
s.push(2);
}
else if (c == ']' && s.top() == -1) //[] -> 3으로 치환
{
s.pop();
s.push(3);
}
else //(x), [x]
{
int num = 0;
while (!s.empty() && s.top() != 0 && s.top() != -1)
{
num += s.top();
s.pop();
}
// num이 x
if (!s.empty() && c == ')' && s.top() == 0) //(x)
{
s.pop();
s.push(2 * num);
}
else if (!s.empty() && c == ']' && s.top() == -1) //[x]
{
s.pop();
s.push(3 * num);
}
else
{ //괄호가 안맞는 경우
cout << 0;
exit(0);
}
}
}
}
while (!s.empty())
{
if (s.top() == 0 || s.top() == -1) //괄호 개수가 안맞는 경우
{
cout << 0;
exit(0);
}
result += s.top();
s.pop();
}
cout << result;
}