본문 바로가기
백준

[백준] 9012번 : 괄호 – JAVA [자바]

by Hongwoo 2022. 7. 11.
반응형

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

 

9012번: 괄호

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

www.acmicpc.net

 

 


  • 문제

 

 


  • 문제 풀이

백준 9012번 괄호는 실버 4 난이도의 자료 구조, 문자열 및 스택 문제이다. 이 문제에서는 T개의 테스트 케이스가 있다. 그리고 각 테스트 케이스에서는 괄호 문자열이 1개 주어진다. 이때 이 괄호 문자열이 올바른 괄호 문자열이면 YES, 아니면 NO를 출력하면 되는 문제이다.

 

이 문제는 꼭 스택을 사용하지 않아도 풀 수 있다. 하지만 스택 문제이니 여기에서는 스택을 이용해서 풀도록 해보겠다.

 

우선 올바른 괄호 문자열이란 괄호가 열리면, 즉 (이 있으면 이 괄호가 무조건 다 닫혀야 한다는 것이다. 즉, 모든 (에는 )이 있어야 하고 개수도 맞아야 한다.

 

우선 Character를 저장하는 스택 stack을 선언한다. 그리고 괄호 문자열에서 (이 들어올 때마다 스택에 push 해주고 )이 들어오면 스택에서 pop 해준다. 단, )이 들어왔을 때 스택이 비어있으면 이 괄호 문자열은 올바른 괄호 문자열이 아니므로 NO를 출력해준다. 

 

이 로직을 코드로 옮긴 것은 밑에 있다.

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            Stack<Character> stack = new Stack<>();
            String s = br.readLine();
            boolean b = true;  //b가 true면 YES, false면 NO
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(j) == '(') {
                    // '('면 스택에 push 
                    stack.push('(');
                } else {
                    // ')'면 스택에서 pop
                    if (stack.isEmpty()) {
                        b = false;
                        break;
                    }
                    stack.pop();
                }
            }
            if (!stack.isEmpty()) b = false;
            if (b) {
                sb.append("YES\n");
            } else {
                sb.append("NO\n");
            }
        }
        System.out.print(sb);
    }
}

 

 

반응형

댓글