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


[알고리즘풀이]

()괄호를 위한 스택1과 []괄호를 위한 스택2 두 개를 이용해서 문제를 해결한다.

1. '(' 괄호를 만나면 스택1에 푸쉬한다.

2. ')' 괄호를 만나면 스택1을 팝한다. 이때, 스택1이 비어있다면 '(' 와 짝이 맞지 않으므로 "NO"를

또 스택2의 top이 스택1의 top보다 크다면 "NO"를 출력하고 종료한다. 아니라면, 계속 진행한다.

* 다음과 같은 경우 : ( [ ) ] 를 의미한다. 

3. 진행이 완료되었을 때, 스택1에 남아있는 '('가 있다면 "NO"를 출력, 아니라면 "YES"를 출력한다.

[]괄호도 마찬가지로 1,2,3 과정을 거친다.

 

[주의사항]

( [ ) ] 과 같은 예시도 ( ) 와 [ ] 가 짝이 맞지만, 균형이 무너져 안 되는 점을 주의해야 한다.

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

using namespace std;

int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(0);
	while(1){
		bool flag = false;
		string input;
		getline(cin, input);
		if (input == ".")
			return 0;
		stack<int> s1, s2;
		for (int i = 0; i < input.length(); i++) {
			if (input[i] == '(') {
				s1.push(i);
			}
			else if (input[i] == '[') {
				s2.push(i);
			}
			else if (input[i] == ')') {
				if (s1.empty()) {
					flag = true;
					break;
				}
				if (s2.empty()) {
					s1.pop();
					continue;
				}
				int c1 = s1.top();
				int c2 = s2.top();
				if (c1 < c2) {
					flag = true;
					break;
				}
				s1.pop();
			}
			else if (input[i] == ']') {
				if (s2.empty()) {
					flag = true;
					break;
				}
				if (s1.empty()) {
					s2.pop();
					continue;
				}
				int c1 = s1.top();
				int c2 = s2.top();
				if (c1 > c2) {
					flag = true;
					break;
				}
				s2.pop();
			}
		}
		 if (flag || !s1.empty() || !s2.empty())
			cout << "no\n";
		else
			cout << "yes\n";
	}
}

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 17298 - 오큰수  (0) 2019.09.20
[BOJ] 1874 - 스택 수열  (0) 2019.09.20
[BOJ] 9012 - Parenthesis  (0) 2019.09.19
[BOJ] 10773 - Zero That Out  (0) 2019.09.19
[BOJ] 10828 - 스택  (0) 2019.09.19

+ Recent posts