Algorithm/BOJ

[BOJ]10799 - 쇠막대기 (C++)

꾸지새미언니 2022. 1. 4. 17:48

문제

https://www.acmicpc.net/problem/10799

코드

#include <iostream>
#include <stack> 
#include <string>

using namespace std; 

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

    stack<char> s; 
    string str; 
    int sum=0; 

    cin >> str; 
    for(int i =0; i< str.length(); i++){
        if(str.at(i) == '(') {
            s.push(str.at(i));
        }
        else{
            if(str.at(i-1) == '('){
                s.pop();
                sum += s.size();
            } else{
                s.pop();
                sum +=1; 
            }
        }
    }
    cout << sum; 
}

풀이

()이 하나의 레이저를 표현하기 때문에 index를 생각하면서 입력받은 문자열은 stack에 넣었다.
(이 오면 stack에 넣고 하나의 막대기를 상징한다고 생각한다.
)이 오는 경우, 만약 이 문자열의 바로 전 인덱스의 char가 (이면 레이저라는 의미이기 때문에 지금까지 스택에 있는 막대기를 두 동강 낸다고 생각한다.
전 인덱스가 (가 아니면 막대기가 끝났다는 의미이므로 그냥 1을 총 막대 개수에 더한다.