백준 9012번: 괄호, 스택

Se0ng_1l·2022년 7월 14일
0

백준

목록 보기
29/40

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

스택(Stack)

Stack이란,

LIFO(Last In First Out)

마지막에 들어간 원소가 가장 먼저 나온다.
예를 들면,
  높이 쌓여진 접시 중 가장 밑에 접시를 꺼내기는 쉽지 않다.
  이때 쉽게 꺼내기 위해서는 맨 꼭대기에 접시부터
  차례대로 꺼내면 쉽게 가장 밑에 접시를 꺼낼수 있다.

관련 함수

#include <stack> : 전처리기
std::stack<Type> 변수명; : 선언
변수명.top() : 스택의 가장 위에 있는 원소를 리턴한다.
변수명.push(데이터) : 
스택에 데이터를 집어 넣어 쌓아 올린다. 이전에 있던 원소는 그 아래로 내려간다.
변수명.pop() : 
스택의 가장 위에 있는 원소를 꺼낸다. 아래에 있던 원소가 top이 된다.
변수명.empty(); : 스택이 비어있으면 1을 리턴한다.
변수명.size(); : 스택의 크기를 리턴

문제 접근

  1. '(' 가 오면 스택에 push한다.
  2. ')'가 오면 stack top을 확인한다.
  3. 이때 정상적인 괄호가 되려면 "()"가 되야한다.
  4. 만약,
    1) stack이 비어있을 때 ')'가 오거나
    2) 비정상적으로 종료되어 스택이 비어있지 않다면 NO, 그 외에는 YES
#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main()
{
    int num;
    string str;
    cin >> num;
    for(int i = 0; i < num; i++)
    {
        stack<char> s;
        cin >> str;
        int j = 0;
        bool flag = true;
        while(str[j] != 0)
        {
            if(str[j] == '(')
                s.push(str[j]);
            else
            {
                if(str[j] == ')'){
                    if(!s.empty() && s.top() == '(')
                        s.pop();
                    else{
                        flag = false;
                        break;
                    }
                }
            }
            j++;
        }
        if(flag && s.empty())
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
}
profile
치타가 되고 싶은 취준생

0개의 댓글