https://www.acmicpc.net/problem/4949
문제
풀이
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));
StringTokenizer st;
while (true){
String test = br.readLine();
if(test.equals(".")){
break;
}
Stack<Character> stack = new Stack<>();
int check = 0;
for(int i = 0; i < test.length(); i++) {
char c = test.charAt(i);
if (c == '(' || c == '[') {
stack.push(c);
} else if (c == ')') {
if(stack.isEmpty()){
check = 1;
break;
}else {
if(stack.pop() == '['){
check = 1;
break;
}
}
}else if (c == ']') {
if(stack.isEmpty()){
check = 1;
break;
}else {
if(stack.pop() == '('){
check = 1;
break;
}
}
}
}
if(!stack.isEmpty() || check == 1){
System.out.println("no");
}else{
System.out.println("yes");
}
}
}
}
문자열을 입력받은 뒤 최종 종료 값인. 이 단독으로 나오기 전까지 반복한다.
이후 문자열의 문자 하나씩을 받은 뒤에 char로 저장하고 만약 이 문자가 ( or [이라면 스택에 추가한다. 짝을 맞추는 것이 우선이기 때문에 후입선출 구조인 스택을 사용했다.
) or ]으로 닫는 문자가 나오면 스택을 검사한다.
1. 스택이 비어있다면 예외가 발생한 것이다. 닫을 짝이 없는데 닫힌 것이기 때문이다.
2. 본인의 짝이 아닌 괄호가 나온다면 이 또한 예외이다. 닫을 수 없는데 닫힌 것이기 때문이다.
위의 2가지 경우 예외를 받아 스택이 비어있는지와 check를 추가적으로 검토한다.
이유는 다음과 같다.
문장이 예외 없이 끝났더라도 스택이 비어있지 않을 가능성이 있다. 따라서 두 가지 모두 검사를 한 뒤에 정답을 출력하도록 한다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준]1406번. 에디터(JAVA) (0) | 2024.04.05 |
---|---|
[백준]9375번. 패션왕 신해빈 (0) | 2024.04.04 |
[백준]2164번. 카드2 (JAVA) (0) | 2024.04.04 |
[백준]1620번. 나는야 포켓몬 마스터 이다솜(JAVA) (0) | 2024.04.04 |
[백준]22233번. 제출(JAVA) (0) | 2024.04.03 |