
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
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(solve(br.readLine())).append('\n');
}
System.out.println(sb);
}
public static String solve(String s){
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
//여는 괄호일 경우 스택에 넣는다.
if(c=='('){
stack.push(c);
}
//닫는 괄호일 경우
else if (c == ')') {
//stack이 비어있으면(즉, 짝꿍인 여는 괄호가 없으면)
if (stack.empty()) {
return "NO";
}
//그게 아니라면(정상적이라면)
stack.pop();
}
}
if(stack.empty()){
return "YES";
}else {
return "NO";
}
}
}
괄호 검사는 후입선출 방식인 스택이 적합하다.
기본적인 검사 방식은 아래와 같다
해당 괄호가 올바른지 판단하는 분기는 3가지가 있다.
1. 여는 괄호와 닫는 괄호가 올바른 경우(여는괄호의 수와 닫는 괄호의 수가 동일한 경우)
예시 : ( ( ( ( ) ( ) ) ( )

2. 괄호가 남는 경우(여는 괄호의 수가 더 많은 경우)
예시 : ( ( ) ) ( ) )

3. 괄호가 부족한 경우(닫는 괄호가 더 많은 경우)
예시 : ( ( ) ) ( ) )

이 분기를 통해 3가지 조건문을 만들 수 있다.
//여는 괄호일 경우 스택에 넣는다.
if(c=='('){
stack.push(c);
}
//닫는 괄호일 경우
else if (c == ')') {
//stack이 비어있으면(즉, 짝꿍인 여는 괄호가 없으면)
if (stack.empty()) {
return "NO";
}
//그게 아니라면(정상적이라면)
stack.pop();
}
}