입력이 쇠파이프 추가 '(' 라면 스택에 쇠파이프를 하나씩 넣어주고, 쇠파이프 제거 ')' 라면 스택에서 뺌으로써 쇠파이프의 갯수를 관리해준다.
쇠파이프와 레이저에 대한 입력값이 똑같으므로, 다음 인덱스의 값을 검사해서 레이저는 따로 처리를 해준다.
입력이 레이저일 경우에는 현재까지 입력되어있는 쇠파이프들을 전부 하나씩 잘라준다.
#include <iostream>
#include <stack>
using namespace std;
int main(void)
{
string line;
cin >> line;
int answer = 0;
stack<bool> s;
for(int i = 0 ; i < line.size() - 1 ; i++) // 뒤에서 하나 전까지 탐색한다
{
if(line[i] == '(')
{
if(line[i+1] == ')') // 만약 레이저로 입력된 ( 라면
{
answer += s.size(); // 레이저로 현재 스택에 있는 파이프들을 다 잘라주고
i++; // 레이저로 닫히는 ) 스킵처리
}
else s.push(true); // 만약 쇠파이프 추가라면 스택에 파이프 추가
}
else // 쇠파이프가 닫힐 경우엔
{
answer++; // 해당 쇠파이프 조각 하나 추가
s.pop(); // 쇠파이프 제거
}
}
answer += s.size(); // 맨 마지막에 레이저가 왔을 수도 있기 때문에 따로 처리
cout << answer << endl;
}