백준 - 9012: 괄호

Lee·2023년 5월 11일
0

알고리즘

목록 보기
24/34
post-thumbnail

문제 출처

문제 출처 : 괄호

문제 이해하기

입력으로 주어진 괄호가 올바르게 구성된 괄호 문자열인지 아닌지를 판별하는 문제이다.

주요 조건 이해하기 ⭐️

올바르게 구성된 괄호 문자열이 어떤 형식으로 들어오는지를 확인할 필요가 있다.
여기서 올바르게 구성된 괄호란? 한 쌍의 괄호 기호로 구성되어 있는지를 의미한다.

(( -> 올바르게 구성되어 있지 않기 때문에 괄호 문자열이 아니다.
() -> 올바르게 구성되어 있기 때문에 괄호 문자열이다.
(()) -> 올바르게 구성되어 있기 때문에 괄호 문자열이다.

여는 괄호가 있다면 반드시 닫는 괄호가 있어야만 올바른 괄호 문자열이 될 수 있다.
이를 바탕으로 순서대로 처리해야하는 일들을 나열해보면

  1. 입력을 받는다.
  2. 문자열의 길이 만큼 반복문을 돌린다. (반복)
    2-1. 문자열의 원소가 여는 괄호인 경우 스택에 추가 (분기)
    2-2. 문자열의 원소가 닫는 괄호인 경우 스택에서 삭제
    2-3. 만약 닫는 괄호가 차례에 스택이 비어있다면 "NO"를 출력
  3. 2의 과정이 끝난 후 스택이 비어있다면 "YES"를 출력, 비어있지 않다면 "NO"를 출력

제출 코드

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

public class Main {

	private static String checkVPS(String str) {
		Stack<Character> stack = new Stack<>();

		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == '(') {
				stack.push('(');
			} else if (stack.isEmpty()) { // 스택이 비어있는 경우, 닫는 괄호를 입력받았으나 pop할 원소가 없을 경우
				return "NO";
			} else {
				stack.pop();
			}
		}

		return (stack.isEmpty()) ? "YES" : "NO";
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int T = Integer.parseInt(br.readLine());

		for (int i = 0; i < T; i++) {
			sb.append(checkVPS(br.readLine())).append("\n");
		}

		System.out.println(sb);
	}

}

0개의 댓글