혹시 ! 다음 문제를 공부하지 않으셨다면, 이 문제를 먼저 풀고 오시는 것을 추천드립니다 👍
2022.05.20 - [자료구조&알고리즘/스택] - [백준] 문자열, 스택 - 9012번 괄호 (Java)
문제링크
접근한 방법
- 문자열, 스택
풀이방법
- 9012번 문제를 풀었다면, 대괄호처리하는 것만 추가해주면 된다.
- 여는 소괄호, 대괄호를 만나면 stack에 push
- 닫는 소괄호를 만났을 때
- stack이 비어있거나 peek한 값이 여는 소괄호가 아닌 경우 실패처리
- 아니라면 stack의 값을 pop
- 닫는 대괄호를 만났을 때
- stack이 비어있거나 peek한 값이 여는 대괄호가 아닌 경우 실패처리
- 아니라면 stack의 값을 pop
- 마지막으로 모든 탐색을 끝냈는데 stack에 남아있다면 실패처리
소스코드 작성 방법
- 스택과 성공 여부를 판단하는 변수 선언
- charAt으로 차례로 각 문자를 탐색 (String.valueOf()로 한번 감싸서 String으로 처리해주었다.)
- .equals()로 문자열 비교하여 앞서 풀이방법에서 이야기했던 로직을 수행한다.
소스코드
package baekjoon.string;
import java.io.*;
import java.util.Stack;
public class Q_4949_BalancedWorld {
public static boolean solution(String str){
Stack<String> stack = new Stack();
boolean isPossible = true;
for (int i = 0; i < str.length(); i++) {
String c = String.valueOf(str.charAt(i));
// 여는 괄호이면 stack에 push
if(c.equals("(") || c.equals("[")){
stack.push(c);
// 닫는 소괄호일 경우
} else if(c.equals(")")){
// 스택이 비어있거나 peek한 값이 여는 소괄호가 아닌 경우
if(stack.empty() || !stack.peek().equals("(")){
return false;
// stack에 여는 괄호가 존재한다면 스택의 값을 pop
} else {
stack.pop();
}
// 닫는 대괄호일 경우
} else if(c.equals("]")){
// 스택이 비어있거나 peek한 값이 여는 대괄호가 아닌 경우
if(stack.empty() || !stack.peek().equals("[")){
return false;
// stack에 여는 괄호가 존재한다면 스택의 값을 pop
} else {
stack.pop( );
}
}
}
if(!stack.empty())
return false;
return isPossible;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(true){
String str = br.readLine();
if(str.charAt(0) == '.'){
break;
}
boolean isPossible = solution(str);
if(isPossible){
bw.write("yes\n");
} else {
bw.write("no\n");
}
}
br.close();
bw.close();
}
}
반응형
'자료구조&알고리즘 > 스택' 카테고리의 다른 글
[백준] 문자열, 스택 - 9012번 괄호 (Java) (0) | 2022.05.20 |
---|
댓글