균형잡힌 세상

구해야 하는 것

  • 문자열의 괄호들이 서로 짝을 이루고 있는지

주어진 자료

  • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
  • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다.
  • 짝을 이루는 두 괄호가 있을 때 그 사이에 있는 문자열도 균형이 잡혀야 한다.
  • 입력의 종료조건으로 점 하나(".")가 들어온다.

조건

  • 문자열이 균형을 이루고 있으면 yes, 아니면 no 출력

계획

  1. 문자열을 돌다가 왼쪽 괄호를 만나면 스택에 넣는다.
  2. 오른쪽 괄호를 만나면 스택에서 꺼내서 짝이 맞는지 확인한다.
  3. 짝이 맞으면 문자열을 마저 돌고, 그렇지 않으면 no 출력

실행

public class Main {
    Stack<Character> stack;
    
    // 균형을 이루고 있는지 체크
    public boolean chkBalance(String s) {
        stack = new Stack<>();
        
        for(int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            
            if(cur == '(' || cur =='[') { // 여는 괄호는 스택에 넣어줌
                stack.push(cur);
            } else if(cur == ')') {
                if(stack.isEmpty() || stack.pop() != '(') { // 스택이 비어있거나 짝이 맞지 않는 경우
                    return false;
                }
            } else if(cur == ']') {
                if(stack.isEmpty() || stack.pop() != '[') {
                    return false;
                }
            }
        }
        
        if(!stack.isEmpty()) { // 스택 비어있지 않으면 짝 없는 괄호가 있는 것
            return false;
        }
        return true;
    }
    
    public void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        while(true) {
            String s = br.readLine();
            if(s.equals(".")) { // 점 하나 입력되면 입력 종료
                break;
            }
            
            if(chkBalance(s)) { // 균형 잡혀있는 경우
                sb.append("yes\n");
            } else {
                sb.append("no\n");
            }
        }
        
        System.out.println(sb.toString());
    }
    
    public static void main(String[] args) throws IOException {
        new Main().solution();
    }
}