본문 바로가기

백준/실버

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

문제링크 : https://www.acmicpc.net/problem/2504

 

#include <bits/stdc++.h> 
using namespace std;

int main()
{
	string s;
	cin >> s;
	stack <char> stack;
	
	int result = 0, cnt = 1;
	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] == '(') { cnt *= 2; stack.push('(');}             //(x) = 2*x
		else if (s[i] == '[') { cnt *= 3; stack.push('[');}        //[x] = 3*x
		else if (s[i] == ')') 
		{ 
			if (stack.empty() || stack.top() != '(') { result = 0; break; }  //스택이 비었거나, 올바르지 못한 괄호열
			if (s[i - 1] == '(') { result += cnt; cnt /= 2; stack.pop();}   //()이면, cnt 값을 더하고 () 값이 2이므로 cnt/=2를 한 후, 스택에서 '(' 제거
			else { cnt /= 2; stack.pop(); }                        //()인 형태가 아니지만 이미 앞에서 값을 더했기에 cnt/=2를 한 후, 스택에서 '[' 제거
		}
		else if (s[i] == ']')
		{
			if (stack.empty() || stack.top() != '[') { result = 0; break; }  //스택이 비었거나, 올바르지 못한 괄호열
			if (s[i - 1] == '[') { result += cnt; cnt /= 3; stack.pop();}   //()이면, cnt 값을 더하고 [] 값이 3이므로 cnt/=3를 하고 스택값 제거
			else { cnt /= 3; stack.pop(); }                        //[]인 형태가 아니지만 이미 앞에서 값을 더했기에 cnt/=3를 하고 스택값 제거
		}
	}
	if (!stack.empty()) { result = 0; }
	cout << result;
}

처음 stack에 push 할 때,

미리 cnt에 값을 계산하고 시작하기에 중복 계산되지 않도록 주의해야 한다.