https://www.acmicpc.net/problem/2504
괄호가 올바른지는 스택을 활용합니다.
여는 괄호가 하나씩 나올 때마다 스택에 넣고 닫는 괄호가 나올 때마다 스택에서 빼서 여는 괄호의 짝이 맞는지 확인해 주면 됩니다.
#include <iostream>
#include <stack>
using namespace std;
int solve()
{
string str;
stack<char> st;
int sum = 0, value = 1;
ios::sync_with_stdio(0), cin.tie(0);
cin >> str;
for (int i = 0; i < str.size(); ++i)
{
const char &c = str[i];
switch (c)
{
case '(':
st.push(c);
value *= 2;
break;
case '[':
st.push(c);
value *= 3;
break;
case ')':
if (st.empty() || st.top() != '(')
{
return 0;
}
else if (str[i - 1] == '(')
{
sum += value;
value /= 2;
st.pop();
}
else
{
value /= 2;
st.pop();
}
break;
case ']':
if (st.empty() || st.top() != '[')
{
return 0;
}
else if (str[i - 1] == '[')
{
sum += value;
value /= 3;
st.pop();
}
else
{
value /= 3;
st.pop();
}
break;
}
}
if (!st.empty())
{
return 0;
}
return sum;
}
int main()
{
cout << solve();
return 0;
}
스택, 이전 인덱스에 해당하는 값을 활용하여 계산해 주면 됩니다.
이전 인덱스에 해당하는 값이 짝이 맞으면 더하고 아니면 더하지 않는다는 것을 깨닫는 것이 중요합니다.