1. 학습한 내용
백준 자료구조 4949번 풀이
2. 알게 된 내용
처음에는 ')'가 입력되고 stack이 비어 있는 경우(']'가 입력되고 stack이 비어 있는 경우)에 stack에 push하는 방식으로.. 진행해서 마지막에 stack이 비어 있지 않게 했는데... 이러면 틀린 것이였다.
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '(' || c == '[') {
stack.push(c);
} else if (c == ')' && stack.size() > 0 && stack.peek() == '(') {
stack.pop();
} else if (c == ']' && stack.size() > 0 && stack.peek() == '[') {
stack.pop();
} else if (c == ')' && stack.isEmpty()) {
stack.push(c);
break;
} else if (c == ']' && stack.isEmpty()) {
stack.push(c);
break;
}
}
반례 - (]).
정답 : no
하지만 위 코드의 경우에는 ]가 들어온 것에 대해 처리를 하지 않는다... 이것이 문제였다.
그래서 고친 코드로는,
while (!(input = br.readLine()).equals(".")) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c == '(' || c == '[') {
stack.push(c);
} else if (c == ')') {
if (stack.isEmpty() || stack.peek() != '(') {
System.out.println("no");
continue Loop1;
}
else
stack.pop();
} else if (c == ']') {
if (stack.isEmpty() || stack.peek() != '[') {
System.out.println("no");
continue Loop1;
}
else
stack.pop();
}
}
위와 같이 딱 해당 괄호에 대해서 직접 처리를 해주는 방법으로 수정했다.
참고 : https://st-lab.tistory.com/180
모든 경우를 잘 고려하면서 코드를 짜자!