#스택 #Stack #ArrayDeque
백준 실버4) 균형잡힌 세상
처음에 문제를 잘못 이해해서 애를 먹었다..
( [ ) ]
=> no 이어야 하는데 yes 인줄..
( ( ) )
( [ ] )
( ( ) )
[ [ ] ]
=> 이런 케이스들이 yes~
위의 기준과 예제를 참고하면서 열심히 코드를 작성했더니?! "틀렸습니다"
// )() 이 가정일 때 막힘. no 인데 yes 반환
// 위 가정일 때를 대비하여 짝이 맞지 않을 때 처리를 해줘야 함.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 소괄호, 대괄호 골라내어 저장 및 균형 체크
while(true) {
String s = br.readLine();
ArrayDeque<Character> stack = new ArrayDeque<>();
if (s.equals(".")) { // . 입력 시 종료
break;
} else {
for(char c : s.toCharArray()) {
switch(c) {
case ']':
case ')':
if (!stack.isEmpty() &&
((c == ']' && stack.peek() == '[') || (c == ')' && stack.peek() == '('))) {
stack.pop();
}
break;
case '[':
case '(':
stack.push(c);
break;
}
}
sb.append(stack.size() > 0 ? "no" : "yes").append("\n");
}
}
System.out.println(sb);
br.close();
}
}
그렇다. 내가 작성한 코드는 처음에 닫는 괄호가 나오는 케이스를 생각하지 못한 것이다.
스택이 비어있거나, 짝이 맞지 않는 경우에는 boolean 변수를 추가하여 구분할 수 있도록 했다.
// 19136KB 184ms
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 소괄호, 대괄호 골라내어 저장 및 균형 체크
while(true) {
String s = br.readLine();
if (s.equals(".")) { // . 입력 시 종료
break;
} else {
ArrayDeque<Character> stack = new ArrayDeque<>();
boolean isBalanced = true;
for(char c : s.toCharArray()) {
switch(c) {
case ']':
case ')':
if (!stack.isEmpty() &&
((c == ']' && stack.peek() == '[') || (c == ')' && stack.peek() == '('))) {
stack.pop();
} else {
isBalanced = false; // 짝이 맞지 않으면 불균형
}
break;
case '[':
case '(':
stack.push(c);
break;
}
}
if (isBalanced && stack.isEmpty()) {
sb.append("yes\n"); // 균형이 맞다면 yes
} else {
sb.append("no\n"); // 불균형이면 no
}
}
}
System.out.println(sb);
br.close();
}
}
첫번째로 작성한 코드에서 도저히 모르겠어서 GPT의 도움을 받았다..
답을 보고 나니 좀 더 생각해볼걸 그랬나 싶다.