') 을 입력받았을때 이것이 레이저를 나타내는지 막대기가 끝나는지를 구분하면 문제를 풀 수 있다.
')' 이 나올때
앞의 값이 '(' 라면 레이저이므로 stack의 사이즈만큼 결과값에 더한다.
앞의 값이 ')' 라면 막대기가 끝나는 것이므로 1을 더한다.
'(' 을 만나면 push를 한다. 다음 ')' 을 만나서 pop을 한다. 이전값이 '(' 이며 레이저를 나타내므로 사이즈인 0을 더한다.
'(' 가 4개연속 나오므로 push를 4번하고 사이즈는 4가 된다.
다음으로 ')' 이 나오므로 pop을 한다. 이전값이 '(' 이며 레이저를 나타내므로 사이즈인 3을 더한다. '(' 가 나오므로 push를 하고 다시 ')'이 나오므로 pop을 하며 레이저를 나타내므로 사이즈인 3을 더한다.
')' 이 나와서 pop을 하며 이전 값이 ')' 이므로 막대기가 끝나게 된다. 사이즈는 2개 되며 1을 더한다.
'(' 이 2개연속 나오므로 push를 2번 하고 사이즈는 4가 된다.
')' 이 나오므로 pop을 하고 이전값이 '(' 이므로 레이저를 나타내니 사이즈인 3을 더한다.
다음 ')' 이 나오므로 pop을 하고 이전값이 ')' 이므로 막대기가 끝나게 된다. 사이즈는 2가 되며 1을 더한다.
'(' 이 나오므로 push를 하고 ')' 이 나오므로 pop을 한다. 이전값이 '(' 이므로 레이저를 나타내며 사이즈인 2를 더한다. ')' 이 2개 연속 나오므로 pop을 2번 하여 사이즈는 0이 되며 2를 더한다.
'(' 이 2번연속 나오므로 push를 2번 하고 ')' 이 나오므로 pop을 한다. 사이즈인 1을 더하며 다음으로 ')' 이 나오므로 막대기가 끝나게 되며 1을 더한다.
따라서 총 17이 나오게 된다.
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
stack<char>s;
string str;
cin >> str;
int res = 0;
for (int i = 0; str[i]!='\0'; ++i)
{
if (str[i] == '(')
s.push(str[i]);
else
{
s.pop();
if (str[i-1] == '(')
res += s.size();
else if(str[i-1] == ')')
res += 1;
}
}
cout << res << '\n';
}