BOJ

백준 9012번 괄호 자바 풀이

이도울 2022. 1. 19. 00:43
SMALL

1. 문제링크

 

9012번: 괄호

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

www.acmicpc.net

 

2. 문제 접근

괄호 문자열에 대한 개념에 대해 이해해야한다. 어렵게 생각할 필요가 전혀 없다. VPS는 괄호의 쌍이 일치하면 되는 것이다. 문제에서 예를 든 것처럼 (())()이나 ((())) 처럼 각자의 괄호 쌍이 일치하면 되는 것으로 이해하면 된다. 그 반대인 경우에는 VPS가 아니므로 NO를 출력하면 된다.

 

3. 문제 풀이

우선  scanner와  stack으로 푸는 방법, bufferedreader와  stack으로 푸는 방법이 있는데, 더 작동시간이 빠른 것은  bufferedreader다. 따라서 bufferedreader의 방법으로 풀어보았다. 

 

// 스택구조 생성을 위해 필요한 모듈
import java.util.Stack;
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 예외처리를 위해 필요한 모듈
import java.io.IOException;
 
public class Test01 {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 문자열로 받은 값을 10진수의 정수형으로 반환해서 T에 저장
		int T = Integer.parseInt(br.readLine());
		
		// T번 만큼 YES 또는 NO를 판별하는 클래스로 괄호 묶음을 넘긴다.
		for(int i = 0; i < T; i++) {
			System.out.println(yesOrNo(br.readLine()));
		}
	}
	
	public static String yesOrNo(String s) {
		// 문자를 담을 수 있는 스택을 선언한다.
		Stack<Character> stack = new Stack<>();
		
		// 괄호의 숫자만큼 반복한다.
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			
			//열린 괄호인 경우 아직 판단할 수 없으므로 스택에 push한다.
			if(c == '(') {
				stack.push(c);
			}else if(stack.empty()) {
				// 이 경우는 스택에 아무것도 없는데 닫힌 괄호가 들어온 경우이다.
				// 그럴 경우 어떤 값이 들어와도 VPS가 성립하지 않기에 NO를 return한다.
				return "NO";
			}else {
				// 이 경우는 스택에 요소가 하나 이상 있으며, 닫힌 괄호가 들어온 경우이므로, pop을 해준다.
				stack.pop();
			}
		}
		
		// 괄호의 숫자만큼 반복이 다 끝났음에도 스택에 요소가 있으면 NO이지만,
		// 아무것도 없으면 YES이다.
		if (stack.empty()) {
			return "YES";
		}
		else {
			return "NO";
		}
	}
}

 

LIST