ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 9012번: 괄호
    스택(Stack) 2018. 6. 14. 16:04
    반응형

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



    1. 문제 요약

     괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 


    여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 



    2. 알고리즘

    스택을 이용하여 ( 문자가 들어오면 push 를 하고 ) 문자가 들어오면 pop 을 한다.


    3. 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    #include <functional>         // greater 사용 위해 필요  
    #include <string>
    #include <map>
    #include <math.h>
    #include <stack>
    using namespace std;
     
    bool check(string str){
     
        const int size = (int)str.length(); //문자열 길이
        stack<char> st;              //char 타입을 받는 stack 선언
     
        for(int i=0; i<size; i++) { //문자열 길이만큼 반복문
            char c = str[i];        //문자 하나씩 받음
     
            if(c == '('){
                st.push(str[i]);    //여는 괄호면 push
            }else{
                if(!st.empty()){    //닫는 괄호면 stack 이 비어있는지 확인후
                    st.pop();       //스택이 비어있지 않으면 pop
                }else{
                    return false;   //비어있으면 false.
                }
            }
        }
        return st.empty();          //반복문이 끝나고 스택에 괄호가 남아있으면 false
    }
     
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0);
     
        int n; cin >> n;
     
        while(n--) {
            string s; cin >> s;
            if (check(s)) {
                cout << "YES" << endl;
            } else {
                cout << "NO" << endl;
            }
        }
        return 0;
    }
    cs

    반응형

    '스택(Stack)' 카테고리의 다른 글

    monotone stack  (0) 2019.08.24
    스택/큐 > 다리를 지나는 트럭  (0) 2018.09.29
    백준 10799번: 쇠막대기  (0) 2018.09.29
    백준 3015번: 오아시스 재결합  (0) 2018.07.01

    댓글

Designed by Tistory.