본문 바로가기
백준 코딩테스트/실버

4949) 균형잡힌 세상 (C++)

by xortl98 2022. 5. 10.
728x90

 출처 

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<deque>
#include<string>

using namespace std;

//true면 무조건 no
bool Check_No = false;

deque<char>dq;

int big_ = 0;	//[
int small_ = 0;	//(


int main()
{
	while (true)
	{
		//한줄씩 문자열을 입력받는다.
		string input;
		getline(cin, input);

		//만일 입력받은 문자열이 .면 종료 
		if (input == ".")
		{
			break;
		}

		//괄호가 있으면 데큐에 넣어줌 
		for (int i = 0; i <= input.length(); i++)
		{
			if (input[i] == '(')
			{
				small_++;
				dq.push_back('(');

			}
			
			else if (input[i] == ')')
			{
				small_--;
				// (이 안나왔다는 거니 종료시키고 no 출력
				if (small_ < 0)
				{
					Check_No = true;
					continue;
				}

				//만일 dq비교중 열린 괄호가 서로 다르면 no 출력 
				if (dq.back() == '[') Check_No = true;
				if (!dq.empty()) dq.pop_back();
			}
			else if (input[i] == '[')
			{
				big_++;
				dq.push_back('[');
			}
			else if (input[i] == ']')
			{
				big_--;
				// (이 안나왔다는 거니 종료시키고 no 출력
				if (big_ < 0)
				{
					Check_No = true;
					continue;
				}

				//만일 dq비교중 열린 괄호가 서로 다르면 no 출력 
				if (dq.back() == '(') Check_No = true;
				if (!dq.empty())  dq.pop_back();
			}
		}

		//0보다 크다는건 괄호가 짝지어지지 않았다는 거임 
		if (Check_No || small_ > 0 || big_ > 0)
		{
			cout << "no" << endl;
		}
		else cout << "yes" << endl;

		//초기화
		small_ = 0;
		big_ = 0;
		Check_No = false;
		dq.clear();
	}
}

 해설

데큐를 이용하여 괄호들을 비교해주었다. 

소괄호 대괄호가 서로 짝을 이루는지, 닫힌 괄호먼저 나오지 않았는지 괄호가 대칭이 되는지 등을 

확인하여 yes no를 출력해주었다. 

 느낀점 

다른 사람은 스택으로 풀었던데 다음 복습할땐 스택으로 풀어봐야겠다.

getline(cin,input)