컴퓨터기본/문제풀이

[백준] 9012번: 괄호

차가운오미자 2021. 8. 7. 16:43

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

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

문자열 파싱 비슷한 문제이다. 

스택을 사용해서 괄호를 넣었다가 빼는 동작으로 최종적으로 스택이 비어있지 않으면, 괄호가 짝이 안맞는다는 말이므로 NO를 출력하면 된다. 

다음과 같은 규칙으로 구현했다. 

 

1. '(' 이면 스택에 넣는다. 

2. ')' 이면 스택에 '(' 이 있는지 확인한다.

 a. 스택이 비었다. -> push()한다.

 b. 스택 탑이 ')' 이다 -> push() 한다.

 c. 스택 탑이 '(' 이다 -> pop()한다. 

 

정답을 answer 벡터에 넣었다가 한꺼번에 출력한다. 

 

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

using namespace std;

int main(void) {
	int n;
	vector<string> answer;
	cin >> n;

	for (int i = 0; i < n; i++) {
		string str;
		stack<char> s;
		cin >> str;

		for (int i = 0; i < str.length(); i++) {
			if (str[i] == '(') {
				s.push('(');
				
			}
			if (str[i] == ')') {
				if (s.empty() || s.top() == ')') {
					s.push(')');
					
				}
				else {
					s.pop();
				}
			}
		}
		if (s.empty()) {
			answer.push_back("YES");
		}
		else {
			answer.push_back("NO");
		}
	}

	for (int i = 0; i < answer.size(); i++) {
		cout << answer[i] << endl;
	}
}