
백준 2504번 괄호의 값 문제를 푸는데 아무리 생각해도 잘못된 부분이 없다 생각하였으나 계속하여 Sefault 에러가 발생하였다.
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
string st;
stack<char> mySt;
long long temp = 1;
long long sum = 0;
int main()
{
cin >> st;
// (()[[]]) -> 2x(2+3x3) => (2x2)+(2x3x3)
for (int i = 0; i < st.length(); i++)
{
if (st[i] == '(')
{
mySt.push(st[i]);
temp*=2;
}
else if (st[i] == '[')
{
mySt.push(st[i]);
temp*=3;
}
else if (st[i] == ')')
{
if(mySt.top()!='(' || mySt.empty())
{
sum=0;
break;
}
else if ((i-1>=0) & st[i-1]=='(')
{
// () 모양
sum+=temp;
mySt.pop();
temp/=2;
}
else
{
mySt.pop();
temp/=2;
}
}
else if (st[i] == ']')
{
if (mySt.top() != '[' || mySt.empty())
{
sum=0;
break;
}
else if(i-1>=0 && st[i-1]=='[')
{
sum+=temp;
temp/=3;
mySt.pop();
}
else
{
temp/=3;
mySt.pop();
}
}
}
if(!mySt.empty())
{
sum=0;
}
cout << sum;
return 0;
}
문제는 아래의 if문에서 발생하였다.
if(mySt.top()!='(' || mySt.empty())
{
sum=0;
break;
}
if (mySt.top() != '[' || mySt.empty())
{
sum=0;
break;
}
mySt.top()을 호출하기 전에 mySt.empty()를 확인해야 하는데
mySt이 비어있는지 확인하지 않은 채로 top()을 호출하기에 segfault 에러가 발생하였다.
조건문에서 OR로 묶을 때 조건의 순서에 유의해야겠다.