Baekjoon

[백준] 9012번 괄호 (Java)

Chaewon Park 2024. 2. 27. 17:26

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

 

9012번: 괄호

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

www.acmicpc.net


문제


알고리즘

 

이번 문제는 Stack을 사용해서 문제를 풀어야 한다! 

Java에는 java.util.Stack 클래스가 있어서 쉽게 stack을 사용해서 문제를 풀 수 있다. (나는 처음으로 사용하는거라 약간 설렌다)

 

Stack 클래스를 사용하는 방법은 다음과 같다.

 

1. Stack 선언

Stack <Integer> stackInt = new Stack<>();
Stack <Character> stackChar = new Stack<>();

 

<> 사이에 원하는 데이터 타입을 넣으면 된다.

 

2. add(), push() : 값 추가

stackInt.push(1);
stackInt.add(2);

 

3. pop() : 마지막 값 삭제

stackInt.pop();

 

4. clear() : 내용 모두 삭제

stackInt.clear();

 

5. peek() : 마지막 값 출력

stackInt.peek();

 

6. empty() : 비어 있는지 확인 (return value : true / false)

Stack <Integer> stack = new Stack <>();

stack.push(1);
stack.push(2);
stack.push(3);

stack.pop(); // 3 삭제
stack.pop(); // 2 삭제

System.out.println(stack.empty()); // false

stack.pop(); // 1 삭제

System.out.println(stack.empty()); // true

 

7. search() : 내용 검색 (return value : index)

Stack <Integer> stack = new Stack <> ();

stack.push(1);
stack.push(2);
stack.push(3);
stack.push(1);

System.out.println(stack.search(2)); // 3 => 인덱스 값
System.out.println(stack.search(1)); // 1 => 가장 최근 값
System.out.println(stack.search(4)); // -1 => 값 없음

 


다시 돌아와서 문제의 해결 방법을 설명하자면,

 

1. String인 PS를 입력받는다.

2. PS의 한 문자씩 검사할 때, 

  • '(' 면, stack에 push()
  • ')'면서 stack에 비어있지 않다면, stack에서 pop()
  • ')'면서 stack이 비어있다면, "NO" 출력

3. PS 끝까지 검사하고 stack이 비어있면, "YES"

4. stack에 내용이 남아있다면, "NO"

 


코드
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int T = Integer.parseInt(br.readLine()); // 데이터 개수
        for(int i=0; i<T; i++) {
            String ps = br.readLine();

            bw.write(isVPS(ps) + "\n");
        }

        br.close();
        bw.flush();
        bw.close();
    }

    // VPS인지 판단하는 함수
    public static String isVPS(String ps) {
        Stack<Character> stack = new Stack<>();

        for(int i=0; i<ps.length(); i++) {
            char psChar = ps.charAt(i);

            if(psChar == '(') { // '(' 일때, stack에 추가
                stack.push(psChar);
            }
            else if(psChar == ')' && !stack.empty()) { // ')' 이면서 stack에 내용이 있다면, pop
                stack.pop();
            }
            else if(psChar == ')' && stack.empty()) { // ')' 인데 stack이 비어있다면, NO
                return "NO";
            }
        }

        if(stack.empty()) {
            return "YES";
        } else {
            return "NO";
        }
    }
}