백준/기타

4949번: 균형잡힌 세상 [C++]

Koalitsiya 2023. 4. 10. 18:12

문제

 

 

풀이

 문자열을 받아 여는 괄호는 스택에 담고, 닫는 괄호는 스택이 비어있지 않고, 스택의 탑이 해당 닫는 괄호와 매칭이 되는 여는 괄호인지 체크해서 두 조건을 만족하면 pop() 만족하지 않으면 flag를 false로 바꾸고 break 한다.

 이후 스택이 비어있고, flag가 true면 균형잡힌 문자열이므로 yes 출력, 아니라면 no를 출력하도록 한다.

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

using namespace std;

int main() {
	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 
	cout.tie(NULL);

	while (true) {
		bool flag = true;
		string s;
		stack<char> bracket;

		getline(cin, s);
		
		if (s == ".") break;

		for (int i = 0; i < s.length(); i++) {
			char c = s[i];

			if (c == '(' || c == '[')
				bracket.push(c);
			else if (c == ')') {
				if (!bracket.empty() && bracket.top() == '(')
					bracket.pop();
				else {
					flag = false;
					break;
				}
					
			}
			else if (c == ']') {
				if (!bracket.empty() && bracket.top() == '[')
					bracket.pop();
				else {
					flag = false;
					break;
				}
			}
		}

		if (bracket.empty() && flag == true) cout << "yes\n";
		else cout << "no\n";
	}
    
	return 0;
}