백준

[백준_9012번] 괄호

빙수빈수 2021. 7. 1. 18:24

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

 

9012번: 괄호

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

www.acmicpc.net

[문제]
 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 

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

 

[코드]

import java.util.*;

public class BaekJoon_9012 {
	public static int point;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int testcase=sc.nextInt();
		
		for(int i=0;i<testcase;i++)
			System.out.println(check(sc.next()));
		}	
	
	public static String check(String str) {
		Stack<Character> stack=new Stack<Character>(); // 스택 선언
		for(int i=0;i<str.length();i++) {
			char ch=str.charAt(i);
			
			// 여는 괄호일 경우 스택에 삽입
			if(ch=='(')
				stack.push(ch);
			
			/*
			 * 여는 괄호가 아닌 닫는 괄호를 입력 받았으나 스택이 비어
			 * pop 할 원소가 없는 경우 온전한 수식어가 아니기 때문에 NO return 
			 */ 
			else if(stack.empty())
				return "NO";
			
			// 닫는 괄호인 경우 스택의 여는 괄호 삭제
			else
				stack.pop();
		}
		
		/*
		 * 검사를 마치고 스택에 잔여 요소가 있다면 여는 괄호가 남아있다는 의미이고,
		 * 스택이 비어있다면 온전한 수식어이다. 
		 */
		if(stack.empty())
			return "YES";
		else
			return "NO";
	}
}

 

[고찰]

 스택의 대표적인 문제이다. 다만 주의해야 할 점이 있는데
첫째, 테스트케이스 마다 문자열을 읽을 때 nextLine() 함수를 사용하면 안된다는 것이다. nextLine() 함수를 사용하여 문자열을 입력받을 경우 '공백' 또는 '개행'을 읽게 될 때 그 이전까지 문자열들을 읽어 반환한다. 이때 내부 버퍼에 개행 또는 공백이 남게 되어 그 다음 nextLine()을 쓰면 해당 문자를 읽게 되어버리기 때문에 next() 함수를 사용해야 한다. 


둘째, 닫는 괄호를 입력 받는 경우 스택에서 제거할 여는 괄호가 남아있지 않다면 스택은 비어있고, 온전한 수식어가 아니게 된다. 이때 예외처리를 해주지 않으면 오류가 나기 때문에 스택이 비어있을때 pop() 함수를 사용하지 못하도록 처리를 해줘야 한다. 이 두 부분만 신경쓴다면 쉽게 해결할 수 있는 문제였다. 

'백준' 카테고리의 다른 글

[백준_2004번] 조합 0의 개수  (0) 2021.07.02
[백준_4949번] 균형잡힌 세상  (0) 2021.07.01
[백준_10773번] 제로  (0) 2021.07.01
[백준_10828번] 스택  (0) 2021.07.01
[백준_2981번] 검문  (0) 2021.07.01