[BOJ] 9012번 괄호 - JAVA

최영환·2024년 4월 30일
0

💡 문제

💬 입출력 예시

📌 풀이(소스코드)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(br.readLine());

        while (T-- > 0) {
            sb.append(process(br));
        }
        
        System.out.println(sb);
    }

    private static String process(BufferedReader br) throws IOException {
        String s = br.readLine();
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return "NO\n";
                }
                stack.pop();
            }
        }

        if (stack.isEmpty()) {
            return "YES\n";
        }
        return "NO\n";
    }
}

📄 해설

접근

  • 스택을 활용한 대표적인 괄호 문제.
  • 여는 괄호 ( 와 닫는 괄호 ) 를 만났을 때에 대한 처리를 다르게 해주면 된다.
  • 여는 괄호 ( 를 만나면 스택에 push 하고, 닫는 괄호를 만나면 스택에서 pop 하는 것이 기본 접근.
  • 닫는 괄호의 경우는 스택이 비어있는지도 확인해야한다. 스택이 비어있을 때 pop 을 해버리면 예외가 발생하기도 하고, 애초에 문제에서 찾고 있는 VPS 가 아니기 때문이다.

과정

  • process() 메소드를 제외하고는 설명할 것이 없으므로 해당 메소드에 대한 설명만 하고 넘어가도록 하겠다.
  • 문자열을 반환하는 메소드로, 입력 받은 문자열이 VPS가 아닌경우 NO 를 반환하고, VPS 인 경우 YES 를 반환하는 메소드
  • 앞서 설명했듯이 여는 괄호 ( 를 만나면 바로 스택에 push 를 해주고, 닫는 괄호 ) 를 만나면 스택이 비어있는지를 먼저 확인한다.
  • 스택이 비어있으면 NO 를 반환한다. 여는 괄호가 존재하지 않는 상태이므로, VPS가 아니기 때문이다. 또한 앞서 말한대로 예외가 발생할 것이다.
  • 스택이 비어있지 않으면 스택에서 pop 한다.
  • 문자열의 문자를 다 확인했는데도 스택이 비어있지 않다면 VPS가 아닌 것이므로 NO를 반환하고, 비어있다면 괄호의 짝이 맞는 문자열. 즉, VPS 이므로 YES 를 반환한다.
profile
조금 느릴게요~

0개의 댓글