반응형
문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.
- 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이룰 수 있다.
- 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이룰 수 있다.
- 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
- 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
- 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
해당규칙들을 만족시켜야한다.
즉, '(' 과 ')' 의 개수가 일치하여야 하고 '(' 가 이전에 있어야한다. (대괄호도 마찬가지)
((())) -> yes이고 (())) , ((()) -> no 이다.
짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.
해당규칙에 따라 ([] [] )(()) ->yes 이고 (([(])) -> no가 된다.
#include <iostream>
#include <string>
using namespace std;
string arr;
int main() {
while (1) {
int stacked[100] = { 0 };
bool jud = true;
int small_bracket = 0, big_bracket = 0, stack_index = 0;
getline(cin, arr);
if (arr[0] == '.'&& arr.size()==1)
break;
for (int i = 0; i < arr.size(); i++) {
if (arr[i] == '(') {
small_bracket++;
stacked[stack_index++] = 1; // 1이 small 2가 big
}
else if (arr[i] == '[') {
big_bracket++;
stacked[stack_index++] = 2; // 1이 small 2가 big
}
else if (arr[i] == ')') {
if (small_bracket < 0) {
jud = false;
break;
}
if (stacked[stack_index-1] != 1) {
jud = false;
break;
}
else
stacked[--stack_index] = 0,small_bracket--;
}
else if (arr[i] == ']') {
if (big_bracket < 0) {
jud = false;
break;
}
if (stacked[stack_index - 1] != 2) {
jud = false;
break;
}
else
stacked[--stack_index] = 0, big_bracket--;
}
}
if (small_bracket != 0 || big_bracket != 0)
jud = false;
if (jud == false)
cout << "no" << endl;
else
cout << "yes" << endl;
}
}
반응형
'알고리즘 > 문자열 처리' 카테고리의 다른 글
[백준] 9935-문자열 폭발(C++) (0) | 2020.02.25 |
---|---|
[백준] 2789-유학 금지(C++) (0) | 2020.02.25 |
[백준] 1152-단어의 개수 (0) | 2020.02.24 |
[백준] 1032-명령 프롬프트 (0) | 2020.02.24 |