import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Baek_4949 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while (true) {
String line = bf.readLine();
if (line.equals(".")) { // 마지막 종료 조건
break;
}
Stack<Character> stack = new Stack<>();
boolean check = true;
for (char x : line.toCharArray()) {
if (x == '(' || x == '[') {
stack.push(x);
} else if(x == ')') {
if(stack.isEmpty() || stack.peek() != '(') {
check = false;
break;
}
stack.pop();
} else if(x == ']') {
if(stack.isEmpty() || stack.peek() != '[') {
check = false;
break;
}
stack.pop();
}
} // end foreach
if(stack.isEmpty() && check) {
sb.append("yes\n");
} else {
sb.append("no\n");
}
} // end while
System.out.println(sb);
}
}
1. Stack 의 초기화
[()]
[.
다음과 같은 입력이 있다고 하자.
[()] 은 정상적인 균형잡힌 모양이다.
다음으로 [. 는 균형이 잡히지 않았다. 하지만 스택을 초기화 하지않고 다음 문자열로 넘어가게 되어 스택에 여전히 [ 가 남아있는 문제가 생기게된다. 이는 문제에 요구사항에 치명적인 문제가 될 수 있으므로 While 문 안에서 초기화를 시켜줘야한다.
2. 조건문의 사용
if(!stack.isEmpty() && !check ) {
sb.append("NO").append("\n");
} else {
sb.append("YES").append("\n");
}