본문 바로가기
문제 풀이/백준(BOJ)

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

by 희조당 2021. 7. 22.
728x90

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net


 문제 풀이

이전 문제와 비슷하다! 하나 차이가 있다면 변수 flag이다.

flag의 필요성은 이전 괄호 문제와 다르게 2개의 다른 괄호가 오기 때문이 필요한 것이다.

왜냐하면 스택이 비어있는데 닫는 괄호가 오거나 괄호의 짝이 맞지 않다면 절대 맞을 수 없기 때문이다.

 느낀 점

코드 자체는 어렵지 않다고 느꼈다. 근데 채점을 하는 도중에 

else flag = false; break; 로 제출했을 때 틀렸다고 나와 채점의 문제라고 생각했는데,

위의 코드는 else { flag = false; } break; 와 같은 코드라는 것을 어떤 유저분에게 배웠다!

 코드

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

using namespace std;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	while (true) {
		string str;
		bool flag = true;
		stack<char> s;
		getline(cin, str);
		if (str == ".") break;

		for (int i = 0; i < str.length();i++) {
			if (str[i] == '(' || str[i] == '[') 
				s.push(str[i]);
			else if (str[i] == ']') {
				if (!s.empty() && s.top() == '[') 
					s.pop();
				else {
					flag = false; 
					break;
				}
			}
			else if (str[i] == ')') {
				if (!s.empty() && s.top() == '(')
					s.pop();
				else {
					flag = false; 
					break;
				}
			}
		}
		if (flag && s.empty()) cout << "yes" << "\n";
		else cout << "no" << "\n";
	}
}

'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글

[C++] 백준 17298번 : 오큰수  (0) 2021.07.23
[C++] 백준 1874번 : 스택 수열  (0) 2021.07.23
[C++] 백준 9012번 : 괄호  (0) 2021.07.21
[C++] 백준 10773번 : 제로  (0) 2021.07.21
[C++] 백준 10828번 : 스택  (0) 2021.07.21

댓글