문제설명

 

소스코드

import java.util.Scanner;
import java.util.Stack;
public class Main {
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int i = 0; i < T; ++i)
		{
			boolean ans = func(sc.next()); //nextLine()이 아니라 next()를 사용
			if(ans == true) System.out.println("YES");
			else System.out.println("NO");
		}
	}
	public static boolean func(String str)
	{
		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < str.length(); ++i)
		{
			char tmp = str.charAt(i);
			if (tmp == '(') stack.push(tmp); //'(' 가 들어오면 push
			else if (stack.empty()) return false; //')' 가 들어오면 pop을 해야하는데 스택이 비었다면 VPS가 아니다.
			else stack.pop(); //')' 가 들어오면 pop
		}
		if (stack.empty()) return true; //'('의 수만큼 ')'의 수가 정상적으로 빠졌다면 스택은 비어있어야 한다.
		else return false;
	}
}

 

설명

  • 기본적으로 '('의 수와 ')'의 수가 같아야 한다.
  • 함수는 문자열을 검사하여 '('가 들어오면 푸시를하고, ')'가 들어오면 팝을 한다.
  • ')'가 들어와서 팝을 해야하는데, 스택이 비어있다면 VPS가 아니다.
  • 문자열을 모두 돌고 스택이 비어있다면 '('의 수와 ')'의 수가 같은 것이다.