컴퓨터기본/문제풀이

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

차가운오미자 2021. 8. 8. 12:31

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

저번에 풀었던 파싱 문제와 비슷한데, ()외에 []의 유효성도 검토해야 한다.

이건 기본적인 논리가 같아서 어렵지 않는데, 입력을 받는 과정이 오히려 신경쓰였다. 

 

아래와 같은 입력 조건 중에

 

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

 

여러줄에 걸쳐서 문자열이 주어진다고 해서, getline()후에 끝이 ','인지를 확인하고, 아니면 다음줄을 concatenate하는 과정을 거쳐야 했다.

 

글자 제한을 준 걸 보면 입력받을 때 배열을 이용해서 참고하라는 거 같은데, 난 배열을 이용하지 않고 그냥 string을 사용했다.

 

 

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

using namespace std;

// 해당 문자열이 균형이 잡혔는지 확인하는 함수
int checkParse(string str) {
	// parse string
	stack<char> s;
	for (int i = 0; i < str.length(); i++) {
		/* 
        	만약 (이면 stack에 넣는다.
			)이면 스택 탑이 (인지 확인
				a. ( 이 아니거나, empty이면 push
				b. (이면 pop
		만약 [이면 stack에 넣는다.
			]이면 스택 탑이 [인지 확인
				a. [ 이 아니면 push
				b. [이면 pop					*/
		if (str[i] == '(') {
			s.push('(');
		}
		else if (str[i] == ')') {
			if (s.empty() || s.top() != '(') {
				s.push(')');
			}
			else {
				s.pop();
			}
		}
		else if (str[i] == '[') {
			s.push('[');
		}
		else if (str[i] == ']') {
			if (s.empty() || s.top() != '[') {
				s.push(']');
			}
			else {
				s.pop();
			}
		}
	}

	if (s.empty()) {
		return 1;
	}
	else {
		return 0;
	}
}

int main(void) {
	
	vector<string> inputs;

	// 입력을 계속 받다가 "."을 받으면 입력받기를 멈춘다. 
	while (1) {
		string str;
		getline(cin, str);
		if (str == ".") {
			break;
		}
		// 만약 str의 끝이 . 이 아니었다면 다음줄을 이어붙인다. 
		while (str[str.length() - 1] != '.') {
			string tmp;
			getline(cin, tmp);
			str = str + tmp;
		}
		inputs.push_back(str);
		
	}

	for (int i = 0; i < inputs.size(); i++) {
		//cout << inputs[i] << endl;
		if (checkParse(inputs[i])) {
			cout << "yes" << endl;
		}
		else {
			cout << "no" << endl;
		}
	}
	
}

'컴퓨터기본 > 문제풀이' 카테고리의 다른 글

Segmentation Fault  (0) 2021.08.23
[백준] 11729. 하노이 탑 이동 순서  (0) 2021.08.21
[백준] 9012번: 괄호  (0) 2021.08.07
[백준] 1152번: 단어의 개수  (0) 2021.06.30
[백준] 1157: 단어 공부  (0) 2021.06.27