본문 바로가기
알고리즘/백준

(백준/자바) 힌트문제1 03. 스택 - 백준 9012번 문제 : 괄호

by son_i 2023. 7. 18.
728x90

9012번: 괄호 (acmicpc.net)

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

스택을 이용하는 너무 간단한 문제

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

public class Stack_03 {
    public static void main(String args[]) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        boolean vpsFlag = true;
        int T = Integer.parseInt(br.readLine());
        for (int i = 0; i < T; i++) {
            String str = br.readLine();

            vpsFlag = vpsCheck(str);

            if(vpsFlag) System.out.println("YES");
            else System.out.println("NO");
        }
    }
    public static boolean vpsCheck(String str) {
        Stack<String> stack = new Stack();
        boolean vpsFlag = true;

        for (String s : str.split("")) {
            if (s.equals("(")) {
                stack.push(s);
            } else { //닫힘 괄호이면
                if (!stack.isEmpty()) { //스택이 비어있지 않으면 ( 빼는데
                    stack.pop();
                } else { //스택이 비어있으면 짝이 안 맞음.
                    vpsFlag = false;
                }
            }
        }
        if (!stack.isEmpty()) {
            vpsFlag = false;
        }
        return vpsFlag;
    }
}

여기서 신경써줘야할 건 들어오는 문자가 다 끝났는데 스택이 비어있지 않을 경우 (==(가 남아있는 경우)

이 경우도 괄호 짝이 맞지 않는 것으로 판단해줘야함.

역시 문제는 풀수록 느는구나

예전에 이 비슷한 문제 풀었던 적이 있는데 그 때는 스택을 쓸 줄 몰라서 엄청나게 복잡하게 했던 것 같다.

좀 알고나서 이 문제를 스택으로 풀었을 땐 훨씬 복잡하게 풀었는데 지금은 코드가 훨씬 간결해 졌다.

다만 시간차이는 예전엔 출력에 StringBuilder를 써서 더 빨랐음.