ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 9012] - [스택] - 괄호 (JAVA)
    알고리즘/스택(Stack) 2018. 11. 30. 14:25

    문제 링크 : https://www.acmicpc.net/problem/9012




    이문제는 괄호 문제중에서 제일 쉬운 문제이다.


    다른 괄호문제는 소괄호 중괄호 대괄호가 나오는데 이 문제는 소괄호 하나로 유효한 괄호 문자열인지 확인하는 문제이다. 


    쉽게 따지면 그냥 여는 괄호가 나오면 스택에 PUSH 하고 닫는 괄호가 나오면 POP 하면 된다.


    유효하지 않은 문자열을 판단하는 기준은 두가지가 있다.


    POP연산을 하려고 하는데 Stack 이 비어 있다면 이번 순서에는 여는 괄호가 입력 돼야하는데 닫는괄호가 입력 됐다는 말이므로 유효하지 않다고 할 수 있다.


    두번째는 모든 연산을 다 끝냈는데 불구하고 스택에 아직도 괄호가 남아 있다면 여는 괄호가 닫는괄호보다 많이 들어왔다는 거고 이 또한 유효하지 않은 괄호 문자열이다. 


    이 두가지만 처리해주면 된다. 


    이 문제를 풀때 스택에는 여는 괄호가 아닌 닫는 괄호를 저장시켰다.

    그 이유는 다른 소괄호 중괄호 대괄호가 섞여 나오는 문제를 풀때 스택에 있는 괄호가 닫는 괄호와 같은지 확인만 하면 되기 때문에 편해서 그렇다. 

    뭐 개인차니깐 스택에는 알아서 넣도록 하자.


    소스

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Stack;
     
    public class Main {
     
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            
            int testCase = Integer.parseInt(br.readLine());
            StringBuilder sb = new StringBuilder();
            
            while(testCase-- > 0) {
                Stack<Character> stack = new Stack<Character>();
                
                String str = br.readLine();
                boolean succ = true;
                for(int i=0; i < str.length(); i++) {
                    char c = str.charAt(i);
                    
                    if(c == '(') {
                        stack.push(')');
                    }else {
                        if(stack.isEmpty()) {
                            succ = false;
                            break;
                        }
                        stack.pop();
                    }
                }
                
                if(succ && stack.isEmpty()) {
                    sb.append("YES \n");
                }else {
                    sb.append("NO \n");
                }
            }
            System.out.println(sb.toString());
        }
    }
    cs


    댓글

Designed by Tistory.