백준 문제풀이

[백준] 9012번 괄호 [JAVA]

늦깍이 2022. 9. 13. 12:42

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

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

www.acmicpc.net


     문제

     문제 풀이

  • 생각을 잘못해서 한 번 틀린 문제이다.
  • 처음 생각, 
    1. size를 0으로 초기화한다.
    2. '('의 경우 size에 1을 더해주고, ')'의 경우 size에 1을 빼준다.
    3. size가 0이면 VPS이고, size가 1이면 VPS가 아니다.
  • 처음 생각의 잘못된 점 : VPS는 "()"가 한 쌍을 이룬다. 그치만 처음 생각으로 풀게 되었을 경우 ")("도 가능한 경우가 된다. 따라서 "()"만 가능한 경우로 다시 한 번 생각해 보도록 하자.
  • 푼 방법 : 스택을 사용하기
    1. 스택을 만든다.
    2. 입력된 문자가 '('일 경우, stack에 push하고, ')'인 경우, stack을 pop한다. 
    *이렇게 해도 괜찮은 이유 : ')'가 먼저 시작하게 되면 결국 순서쌍이 ')('인 괄호쌍이 가능하다고 하는 꼴이기 때문에.
    3. ')'가 더 많이 들어갈 경우, 예외처리 EmptyStackException을 하여 'NO'를 출력한다.
    4. '('가 더 많이 들어갈 경우, stack의 size가 0보다 클 것이므로, stack.size() != 0인 경우 'NO'를 출력한다.
    5. 마지막으로 두 경우가 다 아니면, VPS가 맞으므로 'YES'를 출력한다.

        JAVA code[1] - 처음 틀렸던 생각.

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

public class baekjoon9012 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            int length = str.length();
            int size = 0;
            for (int j = 0; j < length; j++) {
                char ch = str.charAt(j);
                if (ch == '(')
                    size++;
                else
                    size--;
            }
            if (size == 0)
                System.out.println("YES");
            else
                System.out.println("NO");
        }
    }
}

        JAVA code[2] - 스택을 통한 풀이.

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

public class baekjoon9012 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            int length = str.length();
            Stack<String> stk = new Stack<>();
            String[] arr = new String[2];
            for (int j = 0; j < length; j++) {
                char ch = str.charAt(j);
                try {
                    if (ch == '(')
                        stk.push("(");
                    else
                        stk.pop();
                } catch (EmptyStackException e) {
                    arr[0] = "NO";
                    break;
                }
            }
            if (arr[0] == "NO")
                System.out.println("NO");
            else if (stk.size() != 0)
                System.out.println("NO");
            else
                System.out.println("YES");
        }
    }
}