알고리즘 풀이/백준

[4949] 백준 : 균형잡힌 세상(C++)

데롱디롱 2020. 4. 27. 02:35
728x90

 

* 접근한 방법
- getline으로 한 문장씩 받아와서 확인
- ( , [ 가 들어오는경우 => push
- ) , ] 가 들어오는 경우 => 앞에서 여는 기호가 나온 경우 pop, 아닌 경우 no출력

 

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
	while (1)
	{
		string s;
		getline(cin, s);

		if (s.compare(".") == 0)
			break;

		stack<char> st;
		int flag = 0;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] == '(' || s[i] == '[')
				st.push(s[i]);
			else if(s[i] == ')')
			{
				if (!st.empty() && st.top() == '(')
					st.pop();
				else
				{
					cout << "no\n";
					flag = 1;
					break;
				}
			}
			else if (s[i] == ']')
			{
				if (!st.empty() && st.top() == '[')
					st.pop();
				else
				{
					cout << "no\n";
					flag = 1;
					break;
				}
			}
		}
		if(flag==0)
			if (st.empty())
				cout << "yes\n";
			else
				cout << "no\n";

	}
}

 

* 생각하지 못한 점
- 문장이 끝날 때 까지 no가 나오지 않은 경우, 마지막에 yes를 출력하는데 이렇게하면 no는 yes를 또 출력할 수도 있음
  => flag를 이용(no가 나온 경우, flag=1로 바꿔주고 flag가 0일때만 출력!)
- [ab 와 같이 여는 기호만 나온 경우,  아무것도 출력하지 않았음
   => 마지막에 st이 비어있지 않으면 no를 한 번 더 출력!