알고리즘/백준 단계별로 풀기 (12.26 ~ 12.31)

스택 - 백준 4949번 균형잡힌 세상

잡담연구소 2020. 12. 27. 08:35

문제를 풀자마자 바로 글을 써야겠다. 기억이 잘 안난다.

www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

IDEA

9012 괄호 ( www.acmicpc.net/problem/9012 )와 같다. 

몇 번 문장을 받는다와 같은 테스트케이스 갯수가 없다.  온점이 입력될 때까지 문장을 받아야한다.

while문 내에서 getline을 통해 한 줄을 string으로 통으로 받고 인덱스를 하나하나 옮겨가며 본다.

길이가 1이면서 .하나 뿐이라면 break를 걸어 종료한다. 

1. ( 혹은 [ 이면 스택에 무조건 넣는다. 

2. ] 가 들어오면 현재 스택의 top을 확인한다. 

 - 스택이 비어있지 않으며 top이 짝을 이루는 [ 라면 pop한다. 

 - 스택이 비어있다거나, top이 ( 라면 가망이 없다. 균형이 잡히지 않았다. break를 걸어 탈출한다.

3.  ) 에 대해서도 2번과 동일하게 진행해준다. 

4. while문이 중간에 break되지 않고 완전히 끝났을 경우를 대비해 스택이 비어있는지 확인한다. 

모든 괄호,문장에 대해서 작업이 끝났는데도 스택에 뭔가 남아있다면 수가 맞지 않는 괄호세상이기때문이다. 

 

코드  

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

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

		if (sentence.size() == 1 && sentence[0] == '.') break;
		string answer = "yes";

		stack<char>s;

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