백준 9012번 괄호 - 자바 (스택 활용)

728x90

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

 

9012번: 괄호

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

www.acmicpc.net


스택을 활용한 방법입니다.

스택은 입력 출력 할 수 있는 구멍이 한 개인 구조입니다.

아파트 건물을 쌓는다 생각하면 됩니다. 

push는 쌓는 것 입니다.

처음 들어오면 1층이되고 그 다음에 들어오면 2층이 되고 그 다음에 들어오면 3층이 됩니다.

pop는 빼는 것 입니다.

3층 까지 쌓아있을 때 pop를 해주면 3층이 빠지게 됩니다. 1,2 층만 남습니다.

이런 구조입니다.

import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i=0; i<n; i++){
            Stack stack = new Stack();
            String s = sc.next();
            for(int j=0; j<s.length(); j++){
                if(s.charAt(j)=='('){
                    stack.push('(');
                }else if(s.charAt(j)==')'){
                    try {
                        stack.pop();
                    }catch (Exception e){
                        stack.push("fair");
                        break;
                    }
                }
            }
            if(stack.isEmpty()){
                System.out.println("YES");
            }else if(!stack.isEmpty()){
                System.out.println("NO");
            }
        }
    }
}



스캐너로 테스트 케이스 개수 만큼 입력받고 

그 개수 만큼 반복문을 만들어 줍니다.


테스트 케이스 반복 시 마다 스택을 생성하고,

하나의 테스트 케이스를 문자열로 입력받습니다.


입력받은 테스트 케이스의 문자열 개수 만큼 반복문을 만듭니다.

그 후 문자열을 한 개씩 검사합니다.

그 문자가 '(' 이면 스택에 push 합니다. 1층에 '(' 를 쌓습니다.

문자가 '(' 가 아니고 ')' 이면 pop를 해줍니다.

1층에 '(' 가 있었고, 다음 문자로 ')'이 들어와서 pop를 해주면

스택은 빈 상태가 되고 "()" 한 개가 완성된 것 입니다.

 

이 때, 아파트가 빈 상태 즉, 아무것도 쌓여있지 않을 때 pop를 하게 되면 어떻게 될까요?

스택이 비어있다 라는 에러 메세지를 반환합니다. 즉 비어있는 상태에 ')' 라는 문자가 들어오면 해당 테스트 케이스는 "NO" 입니다.

그래서 빈 상태에 에러가 발생하면 바로 반복문을 빠져나갑니다. 이 때, 스택을 검사하기 위해 실패인 케이스에 스택에

"fair"이라는 단어를 push 해줍니다.


각 테스트 케이스 검사가 끝날 때 마다 스택을 검사하여

스택이 비어있으면 "YES"를 출력

스택이 비어있지 않으면 "NO"를 출력 해줍니다.

이전에, fair를 push 해주었죠. 그래서 비어있지 않으면 "NO" 입니다.

스택이 비어있다면 괄호들이 정상적으로 ()를 이루며 다 사라졌기 때문에 비어있는 상태가 된 것입니다.

반응형