문제링크 : 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에 값을 계산하고 시작하기에 중복 계산되지 않도록 주의해야 한다.
'백준 > 실버' 카테고리의 다른 글
[백준 10655번] 마라톤 1 (C++) (0) | 2023.02.06 |
---|---|
[백준 3085번] 사탕 게임 (C++) (0) | 2023.02.06 |
[백준 11725번] 트리의 부모 찾기 (C++) (0) | 2023.02.06 |
[백준 2644번] 촌수계산 (C++) (0) | 2023.02.06 |
[백준 4963번] 섬의 개수 (C++) (0) | 2023.02.06 |