본문 바로가기
자료구조&알고리즘/스택

[백준] 문자열, 스택 - 9012번 괄호 (Java)

by _din 2022. 5. 20.

문제링크

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

 

9012번: 괄호

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

www.acmicpc.net

 

 

접근한 방법

  • 문자열과 스택을 사용

 


풀이방법

  • 여는 괄호를 만나면 stack에 push
  • 닫는 괄호를 만났을 때
    • stack에 여는 괄호가 존재한다면 stack의 값을 pop
    • 여는 괄호가 없다면 실패처리
  • 마지막으로 모든 탐색을 끝냈는데 stack에 남아있다면 실패처리

 

 


소스코드 작성 방법

  • 스택과 성공 여부를 판단하는 변수 선언
  • charAt으로 차례로 각 문자를 탐색 (String.valueOf()로 한번 감싸서 String으로 처리해주었다.)
  • .equals()로 문자열 비교하여 앞서 풀이방법에서 이야기했던 로직을 수행한다.

 

소스코드

package baekjoon.stack;

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

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

        for (int i = 0; i < num; i++) {
            String str = br.readLine();
            Stack<String> stack = new Stack();
            boolean isVPS = true;
            for (int j = 0; j < str.length(); j++) {
                String c = String.valueOf(str.charAt(j));

                // 여는 괄호이면 stack에 push
                if(c.equals("("))
                    stack.push(c);
                else if(c.equals(")")) {
                    if(!stack.empty()){
                        // stack에 여는 괄호가 존재한다면 stack의 값을 pop
                        stack.pop();
                    } else {
                        // 여는 괄호가 없는데 닫힌 괄호가 나왔으면 false
                        isVPS = false;
                        break;
                    }
                }
            }

            if(!stack.isEmpty())
                isVPS = false;

            if(isVPS)
                System.out.println("YES");
            else
                System.out.println("NO");
        }


    }
}

 

반응형

댓글