[ 장르 ] String && Stack
[ 문제 ]

 

9012번: 괄호

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

www.acmicpc.net

  • My Code
// 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열
// 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)
#include <iostream>
#include <string>
#include <stack>

using namespace std;

int main()
{
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
	int n;
	string str;		// 괄호 문자열
	stack<char> stack;		// 괄호문자열 받을 스택

	cin >> n;
	int i = 0,j;
	while (i < n)
	{
		cin >> str;
		if (str.length() % 2 != 0)	// 문자열받은 괄호의 수가 애초에 홀수개이면 VPS가 아님
			cout << "NO" << '\n'; // NO 출력
		else   // 괄호 수가 일단 맞으면 
		{
			for (j = 0; j < str.size(); j++)	// 문자열 수만큼 반복
			{
				if (str[j] == '(')		// 여는 괄호면 스택에 넣고
					stack.push('(');
				else
				{	// 닫는 괄호면 가장 안쪽 여는괄호 스택에서 pop, 짝꿍
					if (!stack.empty()) { stack.pop(); }	// 단, 스택에 여는 괄호가 있는경우만
					else { break; }	// 스택에 여는 괄호없는데, 현재 닫는 괄호가 들어왔다면 VPS가 아님
				}
			}
			if (j == str.size() && stack.size() == 0)	// 괄호문자열 끝까지 조회했고, 여는 괄호스택도 다 쓴거면
				cout << "YES" << '\n';	// VPS 맞음
			else
				cout << "NO" << '\n';	// 아니면 VPS 아님
		}
		while (!stack.empty())	// 한 차례마다 끝나면, 여는괄호 스택 비우기
			stack.pop();
		i++;
	}
	return 0;
}

 " 매 단계, 여는 괄호 스택을 비워줘야합니다. "

[ CheckPoint ]

  • 문제를 읽어보면 딱 "스택" 문제라는걸 느낄 수 있을 것이다.
  • 내 풀이 Point는 아래 부분이다.

  • 문자열 끝까지 탐색을 했고, 그 때 여는 괄호 스택도 비어있을경우( 전부 사용한 경우 ) => VPS 가 맞음
    문자열 끝까지 탐색은 했는데, 여는 괄호 스택에 아직 데이터가 있는 경우( 여는 괄호가 남아있는 경우 ) => VPS 가 아님


728x90
반응형

+ Recent posts