[백준 10799] 쇠막대기 (C++)

송칭·2023년 12월 19일
0
#include <cstring>
#include <stack>
#include <iostream>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int result = 0;
    string s;

    stack<int> stack;
    cin >> s;

    char behind;
    for (char c : s) {
        if (c == '(') {
            // 쇠막대기 하나가 추가되는 것
            stack.push(0);
            behind = '(';
        }
        else if (c == ')') {
            // 쇠막대기 하나가 끝나거나 혹은 절단되는 것
            stack.pop();
            if (behind == '(') {
                // 절단의 경우
                result += stack.size();
            }
            else {
                // 쇠막대기 하나가 끝나는 경우
                result++;
            }

            behind = ')';
        }
    }

    cout << result;
}

첫 번째 예시는 문제에서 친절히 그림을 그려주었으므로, 두 번째 예시를 위주로 그림을 그려 구현방식을 연구해보았다.

'(' 와 ')' 는 단순히 새로운 쇠막대기가 추가되거나 삭제되는 것을 의미하지는 않는다. '(', ')'가 연달아 입력된 경우, 현재까지 누적된 쇠막대기를 절단하게 된다. 이 경우를 따로 생각하기 위해서는 이전에 어떤 문자가 입력되었는지를 기억해야한다. 그래서 behind라는 char 변수를 선언해 이곳에 직전의 값을 저장하도록 했다.

behind가 '(' 라면 이는 절단을 의미하며, ')' 라면 쇠막대기 하나가 끝나는 경우이다.
우선, 무조건 '(' 가 입력되면 stack에 아무 값 0을 push한다. 그리고 '(' 가 입력되면 stack을 pop한다. pop을 할 때 empty 조건을 고려하지 않았는데, 이는 입력값으로 주어지는 괄호 배열이 무조건 짝수가 맞다는 신뢰가 있었기 때문이다.
')' 가 입력되면 behind에 따라 분기를 나눠주는데 절단의 경우에는 stack의 현재 size만큼을 result에 더하면 되고, 쇠막대기가 끝나는 경우엔 result에 단 1만 더하면 된다.

profile
게임 클라이언트

0개의 댓글