[BaekJoon]#9012 괄호

현굥·2024년 8월 18일

BaekJoon

목록 보기
13/53


문제이해

여는 괄호 '(' 가 있으면 반드시 닫는괄호')' 가 존재해야 한다는 것입니다.
만약, 주어진 문자열이 괄호의 조건을 성립하면 YES를, 성립하지 않으면 NO를 출력하는 문제입니다.

입력

입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.

출력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.


문제접근

Stack를 이용하여 문제를 풀었습니다.

  • 열린 괄호가 입력으로 들어오면 stack에 push 하고, 닫힌 괄호가 입력으로 들어왔을때, 스택에서 열린 괄호를 pop하는 방식입니다.
  • 연산 이후 최종 스택이 비어있다면 완전한 괄호식이라고 볼 수 있고, 연산 이후 스택이 비어있지 않다면, 짝이 맞지 않는것을 의미하기 때문에 온전한 괄호수식이라고 볼 수 없습니다.
  • 만약, 스택이 비어있는 경우에 닫힌괄호가 입력으로 들어온다면, pop 할 요소가 존재하지 않으므로, 잘못된 참조가 됩니다.

이 셋을 고려하여 분기문을 작성하였습니다.

for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i); 
			// 여는 괄호일 경우에 스택에 push
            if (ch == '(') {
                stack.push(ch);
            } 
            // 닫힌괄호인데 스택이 비어있을 경우 NO리턴
            else if (stack.isEmpty()) {
                return "NO";
            }
            // 닫힌괄호가 들어오면 여는괄호를 pop
            else {
                stack.pop();
            }
        }
		// 검사를 마치고 최종 stack에 잔여요소가 있는지 확인 
        if (stack.isEmpty()) {
            return "YES";
        } else {
            return "NO";
        }

입력데이터의 갯수를 입력받고, 그 갯수만큼 문자열을 확인해야합니다.

  • 입력데이터 갯수만큼 for문을 지정해주었고, 문자열이 괄호의 정의를 만족하는지 확인하기 위해 solve 함수를 선언해주었습니다.
  • 결과값은 stringBuilder를 선언하여 출력해주었습니다.

code

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

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 j = 0; j < N; j++) {
            sb.append(solve(br.readLine())).append("\n");
        }
        System.out.println(sb);
    }


    public static String solve(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

            if (ch == '(') {
                stack.push(ch);
            } else if (stack.isEmpty()) {
                return "NO";
            } else {
                stack.pop();
            }
        }

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

0개의 댓글