백준 문제풀이/실버4

백준 4949번 - 균형잡힌 세상

void_melody 2022. 3. 5. 17:13

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

[이 왔다면 무조건 ]가 그 다음에 와야하고

(이 왔다면 무조건 )이 그 다음에 와야한다. 그 사이에 다른 기호가 와버리면 에러가 난다.

우선 이 원칙에 따라서 생각한게 스택이었다.

말 그대로 (이나 [이 온 게 먼저 쌓여있어야하고 그 이후에 온걸 확인하고 빼야하기때문이다.

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

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

	while (true)
	{
		string input;
		getline(cin, input);

		std::stack<char> s;
		bool flag = true;
		if (input.length() == 1 && input[0] == '.')
			break;
		for (int i = 0; i < input.length(); i++)
		{
			if (input[i] == '[' || input[i] == '(')
				s.push(input[i]);
			if (input[i] == ']')
			{
				if (s.empty() || s.top() == '(')
					flag = false;
				else
					s.pop();
			}
			if (input[i] == ')')
			{
				if (s.empty() || s.top() == '[')
					flag = false;
				else
					s.pop();
			}
		}
		if (s.empty() && flag)
			cout << "yes" << '\n';
		else
			cout << "no" << '\n';
	}
	
	return 0;
}

문자열이 여러개 일 수 있기 때문에 getline함수를 사용했다. 

bool 타입의 flag 변수 활용은 너무나 자주 쓰이니까 잘 기억해놓자.

나는 보통 반복문에서 break하기 애매할 때 조건문으로 쓰는 것 같다