티스토리 뷰

알고리즘/Baekjoon

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

개발하는 크롱 2020. 11. 21. 22:04
반응형

문제 링크: www.acmicpc.net/problem/4949  

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

스택을 활용한 문제이다. 

여는 괄호가 나왔을 때 스택에 넣어주고, 닫는 괄호가 나왔을 때 스택의 top(제일 최근에 들어간 여는 괄호)와 짝이 맞는지 확인한다. 짝이 맞지 않으면 flag를 false로 바꾸고 반복문을 탈출한다.

짝이 맞지 않는 경우가 없었어도 마지막에 여는 괄호만 나오고 닫는 괄호가 나오지 않았으면 올바른 문자열이 아니다. 이 경우 스택에 원소가 남아있다.

flag가 false인 경우와 스택에 원소가 남아있는 경우 "no"를 출력하고 아닌 경우 "yes"를 출력한다.

 

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

int main() {
	string str;
	stack<char> st;

	while (true) {
		getline(cin, str);

		// 입력 종료 조건
		if (str == ".") {
			break;
		}

		// 스택 초기화
		while (!st.empty()) {
			st.pop();
		}

		bool flag = true;
		for (int i = 0; i < str.length(); i++) {
			// 여는 괄호 만나면 스택에 넣기
			if (str[i] == '(' || str[i] == '[') {
				st.push(str[i]);
			}
			else if (str[i] == ')') {
				if (!st.empty() && st.top() == '(') {
					st.pop();
				}
				else {
					flag = false;
					break;
				}
			}
			else if (str[i] == ']') {
				if (!st.empty() && st.top() == '[') {
					st.pop();
				}
				else {
					flag = false;
					break;
				}
			}
		}

		if (flag && st.empty()) { // 스택이 비어있어야 한다
			cout << "yes\n";
		}
		else {
			cout << "no\n";
		}
	}

	return 0;
}
반응형

'알고리즘 > Baekjoon' 카테고리의 다른 글

백준 1398: 동전 문제 (C++)  (0) 2020.11.25
백준 1918: 후위 표기식 (C++)  (0) 2020.11.22
백준 2164: 카드2 (C++)  (0) 2020.11.21
백준 1966: 프린터 큐 (C++)  (0) 2020.11.21
백준 10828: 스택 (C++)  (0) 2020.11.21
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함