-
백준 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. 코드
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#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