[Algorithm] Stack Segfault 런타임 에러

YUNU·2024년 2월 17일

알고리즘

목록 보기
9/15
post-thumbnail

🤖 Algorithm


🟦 Segfault 에러를 주의하자.

백준 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로 묶을 때 조건의 순서에 유의해야겠다.

profile
DDeo99

0개의 댓글