문제 풀이/백준

[백준]4949번. 균형잡힌 세상(JAVA)

27200 2024. 4. 4. 16:55

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를 추가적으로 검토한다.

 

이유는 다음과 같다.

문장이 예외 없이 끝났더라도 스택이 비어있지 않을 가능성이 있다. 따라서 두 가지 모두 검사를 한 뒤에 정답을 출력하도록 한다.