import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import static java.util.Collections.*;
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());
for (int i = 0 ; i < N; i++)
{
String line = br.readLine();
Stack<Character> stack = new Stack<>();
boolean balance = true;
for (char ch : line.toCharArray()) {
if (ch == '(') {
stack.push(ch);
}
if (ch == ')') {
if (stack.isEmpty()) {
balance = false;
break;
}
else{
stack.pop();
}
}
}
if (balance && stack.isEmpty())
{
System.out.println("YES");
}
else{
System.out.println("NO");
}
}
}
}
이전 문제랑 비슷하게 스택 구조를 이용해서 문제를 푸는 문제이다. .pop()은 가장 최근에 들어간 값을 제거하는 것이다. 따라서 (이 push가 된 후에 )이 들어올 때 문자열이 비어있지 않다면 pop을 이용하여 (을 제거하는 방식으로 진행한 후에 만약 문자열을 다 검사하고서 문자열이 비어 있지 않다면 개수가 맞지 않는다는 것이므로 false이다.