본문 바로가기

알고리즘(C++)/백준 알고리즘

[백준] C++ 2504번 : 괄호의 값

풀이과정


1. 입력받은 문자가 '('나 '['면 스택에 push 한다. 결과값은 벡터에 저장한다.

     (벡터의0번째 = 최종 결과값, 그 외 = 곱셈연산 내부 결과값 저장)  

2. ')'일 때, 스택의 top이 '['가 아닌 경우 아래를 수행한다.

  - 이전에 입력한 문자가 '('라면 "()"로 2의 값을 갖고, 스택에서 pop 한 후 결과(iResult)값에 2를 더한다.

  - 이전에 입력한 문자가 '('가 아니라면 '(X)'로 2*X값을 수행한다.    

     * 스택의 사이즈가 0이라면 vector의 0번째에 2를 더한다.

     * 스택의 사이즈가 1이라면 곱셈 연산이 있으므로 벡터의 스택 사이즈 번째(v.at( st.size() ) )에 2를 곱한 후

       v.at( st.size()-1 )에 저장한다.

 

위의 과정을 반복한 후 스택의 사이즈가 0이 아니라면 올바르지 못한 괄호열로 0을 출력하고, 0이라면 벡터의 0번째에 저장된 덧셈&곱셈의 최종 결과를 출력한다.

 

코드


더보기
#include <iostream>
#include <stack>
#include <vector>
#include <string>

using namespace std;

int main()
{
	int iResult = 0;
	string s;
	stack<char> st;
	vector<int> v;

	v.resize(30);
	
	cin >> s;

	for (int i = 0; i < s.length(); ++i)
	{
		if (s[i] == '(' || s[i] == '[') st.push(s[i]);
		else
		{
			if (st.empty())
			{
				st.push(s[i]);
				break;
			}
			else
			{
				if (s[i] == ')')
				{
					if (st.top() != '[')
					{
						st.pop();
						if (s[i - 1] == '(') v.at(st.size()) += 2;
						else
						{
							v.at(st.size()+1) *= 2;
							v.at(st.size()) += v.at(st.size() + 1);
							v.at(st.size() + 1) = 0;
						}

					}
				}
				else if (s[i] == ']')
				{
					if (st.top() != '(')
					{
						st.pop();
						if (s[i - 1] == '[') v.at(st.size()) += 3;
						else
						{
							v.at(st.size() + 1) *= 3;
							v.at(st.size()) += v.at(st.size() + 1);
							v.at(st.size() + 1)=0;
						}
					}
				}
			}
		}
	}
	if (st.empty()) iResult = v.at(0);
	else iResult = 0;
	
	cout << iResult << endl;
	return 0;
}