위 문제는 이전에 풀었던 스택 문제에서 활용된 문제이다.
기존 문제와 차이점은 괄호 종류가 2가지(소괄호, 대괄호) 라는 것과 괄호 안에 공백과 알파벳 문자열이 포함되어 있다는 점이다.
문제 풀 때, 고려할 사항을 다음과 같이 정리했다.
1. 문자열이 "." 온점인지 확인 후 맞을 경우, 반복문 종료.
2. 균형이 맞는지 여부를 판단하는 기준은 "닫는 괄호"를 만났을 때, 괄호 종류에 맞는 "여는 괄호"가 존재하는지를 기준으로 판단.
3. 괄호 문자 이외의 다른 문자열은 무시하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str;
while(true){
str = br.readLine();
if(str.equals(".")) break;
Stack<Character> stack = new Stack<>();
for(int i=0; i < str.length(); i++){
char ch = str.charAt(i);
switch(ch){
case '[' :
stack.push(ch);
break;
case '(' :
stack.push(ch);
break;
case ']' :
if(!stack.empty() && stack.peek() == '[') stack.pop();
break;
case ')' :
if(!stack.empty() && stack.peek() == '(') stack.pop();
break;
}
}
if(stack.empty()){
sb.append("yes");
}else{
sb.append("no");
}
sb.append("\n");
}
br.close();
System.out.println(sb);
}
}
솔직히 아직도 위코드가 왜 오답인지 이해가 되지 않는다. 스터디원들한테 질문 해봐야겠다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String str;
while(true){
str = br.readLine();
if(str.equals(".")){
break;
}
sb.append(solve(str)).append("\n");
}
br.close();
System.out.println(sb);
}
static String solve(String str){
Stack<Character> stack = new Stack<>();
for(int i=0; i < str.length(); i++){
char ch = str.charAt(i);
if(ch == '(' || ch == '['){
stack.push(ch);
}else if(ch == ')'){
if(stack.empty() || stack.peek() != '('){
return "no";
}else{
stack.pop();
}
}else if(ch == ']'){
if(stack.empty() || stack.peek() != '['){
return "no";
}else{
stack.pop();
}
}
}
if(stack.empty()){
return "yes";
}else{
return "no";
}
}
}
위처럼 메서드를 분리하여 구현하였으며, 다른 사용자의 풀이를 참고하였다.