본문 바로가기
개인 공부/코딩테스트

[C++][백준 9012][스택] 괄호 :: seoftware

by seowit 2020. 2. 21.

문제

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

 

9012번: 괄호

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

www.acmicpc.net

소스코드

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main(void) {
	int k;
	cin >> k;
	
	while (k > 0) {
		k--;
		string input;
		cin >> input;

		stack<char> st;
		string answer = "YES";
		for (int i = 0; i < input.length(); i++) {
			//'('는 스택에 저장
			if (input[i] == '(') {
				st.push(input[i]);
			}
			//')'가 나오면 스택에 저장된 '('와 짝이 맞는지 확인하고 pop
			else if (!st.empty() && input[i] == ')' && st.top() == '(') {
				st.pop();
			}
			//위의 경우를 제외하고는 모두 vps가 아닌 상황이므로 종료(break)
			else {
				answer = "NO";
				break;
			}
		}
		//'('와 ')'가 짝이 안 맞는 경우 '('가 모두 pop되지 않기 때문에
		// 스택이 비지 않는다. 따라서 이 경우는 vps가 아니므로 "NO"
		if (!st.empty()) answer = "NO";

		cout << answer << endl;
	}
	return 0;
}

포인트는 '('만 스택에 저장한다는 점!! 나머지는 주석에 써놨어요

결과화면

댓글