백준 - JAVA/스택

[백준] 4949번 균형잡힌 세상 _ JAVA ( 주석 설명 )

wch_s 2023. 3. 15. 01:13

풀이

1) 열린 괄호 '(' , '{' '[' 가 나오면 stack 에 push 를 한다.

2) 닫힌 괄호 ')', '}', ']' 가 나오면 stack 에서 pop 을 한다.

이 때 stack이 비어있거나 stack 에 가장 위의 값(peek())과 매칭이 되지 않으면 false(불균형)을 return 한다.

 

코드

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();

        while(true){
            String str = br.readLine();
            if(str.equals(".")) //"."이 올 때까지 반복
                break;
            char[] sentence = str.toCharArray();


            boolean result = solve(sentence); //문장마다 solve() 실행

            if(result){ //문자열이 균형을 이루고 있으면 "yes"
                sb.append("yes").append('\n');
            }
            else{ //불균형이면 "no"
                sb.append("no").append('\n');
            }
        }
        System.out.println(sb);
    }

    private static boolean solve(char[] sentence) {
        Stack<Character> stack = new Stack<>(); //괄호 매칭을 위한 stack 생성

        for(char i : sentence){
            if(i == '(' || i == '{' || i=='[') //열린 괄호를 만나면 stack에 push를 해준다.
                stack.push(i);

            else if (i == ')'){ //닫힌 괄호를 만나면 검사
                if(stack.empty() || stack.peek() != '(') //비어있는 경우 or 가장 최근 괄호와 매칭 시 불일치 => false
                    return false;
                else //괄호 매칭이 되면 pop 진행
                    stack.pop();
            }
            else if (i == '}'){
                if(stack.empty() || stack.peek() != '{')
                    return false;
                else
                    stack.pop();
            }
            else if (i == ']'){
                if(stack.empty() || stack.peek() != '[')
                    return false;
                else
                    stack.pop();
            }
        }

        if(!stack.empty()){ //한 쪽 괄호가 더 많을 경우 false
            return false;
        }

        return true; //나머지는 모두 true
    }
}