문제

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

 

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마

www.acmicpc.net

 

풀이

초반부터 설계를 제대로 하고 풀지 않아서 오래 걸렸다. 

쉽게 금방 풀릴줄알아서 바로 코드에 들어간 게 문제였다. 

 

신경 써야 할 점은

 

1. 공백 또한 입력받아야 한다. (string 헤더의 getline() 사용 필요 )

2. 스택의 경우의 수를 모두 생각 ->  ')' or ']'가 등장하였을 때 스택에 문자가 있긴 한지, 있다면 그사이 문자열 또한 균형이 잡혀있는지 판단하여야 한다.

 

 

 

코드

#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<stack>
using namespace std;
string arr;
stack<char> st;
vector<bool> result;
int main() {


	while (1) {
		bool flag = false;
		
			//<srting> 헤더의 getline()을 활용한 공백문자 입력 포함 , 개행(enter)까지 문자를 받음 
			
			getline(cin, arr);
			
			
		if (arr.size() == 1 && arr[0]=='.') break; //종료조건

		for (int i = 0; i < arr.size(); i++) {

			if (arr[i] == '(' || arr[i] == '[') st.push(arr[i]);
			
			if (!st.empty()) { 
				if (arr[i] == ')' && st.top() == '(') {
					st.pop();
				}
				else if (arr[i] == ']' && st.top() == '[') {
					st.pop();
				}
				else if (arr[i] == ')' && st.top() != '(') {
					flag = true;
					break;
				}
				else if (arr[i] == ']' && st.top() != '[') {
					flag = true;
					break;
				}
			}
			else { //비었을때
				if (arr[i] == ')' || arr[i] == ']') {
					flag = true;
					break;
				}
			}

		
			

		}

		if (st.size() == 0 && flag == false) result.push_back(true);
		else result.push_back(false);

		//다음을 위해 스택,문자열비우기 

		while (!st.empty()) {
			st.pop();
		}
		arr.clear();

	}

	for (int j = 0; j < result.size(); j++) {
		if (result[j] == true) cout << "yes" << endl;
		else cout << "no" << endl;
	}

	return 0;
}

+ Recent posts