백준 문제풀이/etc

[STACK] BOJ 9012 번 문제풀이

준코딩 2019. 5. 12. 00:33

문제분석

 

굉장히 읽기 싫을 정도로 긴 문제지만

결국 소괄호가 한쌍으로 존재하는 가? 

를 묻는 문제네요. ㅎㅎ

 

알고리즘 문제를 풀 때, 접근법이 굉장히 중요한 게

제가 처음에 이 문제를 접근하는 

방법은 이렇습니다.

 

'(' , ')' 두 개의 개수를 카운트해서

같으면 VPS 이다 ~ 

 

라고 접근했습니다.

이 방법 역시 그렇게 어렵진 않지만

굉장히 단순 무식한 방법 같았습니다.

 

그래서 다른 분들의 코드를 보니

세상에 천재들이 많더군요.

 

개발자 지망생 김 모 씨의 접근법은 이렇습니다.

 

여는 괄호 '(' 가 나오면 무조건 스택에 PUSH 하고

닫는 괄호 ')' 가 나왔을 때,

배열 안에 여는 괄호 '(' 가 존재하면 스택에서 POP 하고

배열이 비어있다면 FALSE  하는 겁니다.

 

같은 문제를 이렇게 구현할 수 있다는 점에서 

정말 놀랐습니다.... 

 

어쨌든 이 문제는 이런 식으로 

한 줄 한줄 문자열을 받아서

해당 문자열이 VPS 인지 판별한 후 

YES or NO 를 출력하는 문제였습니다.

 

 

코드

 

#include "bits/stdc++.h"

using namespace std;

bool compare(string str)
{
	int len = (int)str.length();
	stack<char> arr;

	for (int i = 0; i < len; i++)
	{
		char c = str[i];

		if (c == '(') arr.push(str[i]);
		else
		{
			if (!arr.empty()) arr.pop();	
			else return false;
		}
	}
	return arr.empty();
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	string str;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> str;
		if (compare(str)) cout << "YES" << '\n';
		else cout << "NO" << '\n';
	}
	return 0;
}