본문 바로가기
Algorithm

(BOJ) 10799

by snwo 2022. 2. 2.
#include <bits/stdc++.h>
using namespace std;

stack<char> S;
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    string input;
    int sum = 0;
    cin >> input;
    for (int i=0;i<input.size();i++)
    {
        if (input[i] == '(')
            S.push('(');
        else
        { // c == ')'
            if (input[i-1] == '(')
            { // laser
                S.pop();
                sum += S.size();
            }
            else
            { // end of the iron rod
                S.pop();
                sum++;
            }
        }
    }
    cout << sum;
}

열린괄호 : 쇠막대, 스택에 push 하여 겹쳐있는 막대의 개수를 구할 떄 사용

닫힌괄호 : 쇠막대의 끝을 나타낸다.

레이저로 잘려서 남은 쇠막대, 혹은 잘리지 않고 남은 쇠막대를 의미한다.

스택에서 하나 pop 한 뒤, 쇠막대 카운트 +1

열린괄호&닫힌괄호가 연속해 있는 경우 : 레이저이다. 레이저 기준으로 잘린 왼쪽의 막대만큼 카운트 (stack size)