백준/Java

[백준 자바] 9012번(괄호) | Stack 스택

gamzaggang7 2024. 3. 4. 01:14
728x90

난이도 - 실버 4

문제

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

출력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 

 


 

 

728x90

 

1. 스택 사용

import java.io.*;
import java.util.Stack;

public class Main9012 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine());
        Stack<Character> stack;

        for (int i = 0; i < T; i++) {
            char[] c = br.readLine().toCharArray();

            stack = new Stack<>();
            if (c[0] == ')')
                bw.write("NO");
            else {
                stack.add(c[0]);
                for (int j = 1; j < c.length; j++) {
                    if (!stack.isEmpty() && stack.peek() == '(' && c[j] == ')')
                        stack.pop();
                    else
                        stack.add(c[j]);
                }

                if (stack.isEmpty())
                    bw.write("YES");
                else
                    bw.write("NO");
            }
            bw.newLine();
        }

        bw.flush();
        br.close();
        bw.close();
    }
}

줄마다 배열로 생성하여 배열값을 하나씩 스택과 비교한다.

스택의 맨 윗값이 '('이고, 비교할 배열값이 ')'면 스택의 맨 윗값을 뺀다. 그 외의 경우엔 배열값을 스택에 넣는다.

모든 배열값들과 비교가 끝나고 스택이 비어있으면 VPS이다.

 

 

2. StringBuffer 사용

스택말고 스트링버퍼를 사용해서 풀수도 있다. 로직은 그대로 하고 스택을 스트링버퍼로만 바꿨다.

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

        for (int i = 0; i < T; i++) {
            char[] c = br.readLine().toCharArray();

            sb = new StringBuffer();
            if (c[0] == ')')
                bw.write("NO");
            else {
                sb.append(c[0]);
                for (int j = 1; j < c.length; j++) {
                    if (sb.length() != 0 && sb.charAt(sb.length() - 1) == '(' && c[j] == ')')
                        sb.deleteCharAt(sb.length() - 1);
                    else
                        sb.append(c[j]);
                }

                if (sb.length() == 0)
                    bw.write("YES");
                else
                    bw.write("NO");
            }
            bw.newLine();
        }

        bw.flush();
        br.close();
        bw.close();
    }
}

728x90