[BOJ 28709] 와일드카드 괄호 문자열
View as PDF
Submit solution
Points:
3
Time limit:
1.0s
Memory limit:
1G
Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text
‘(’, ‘)’로 이루어진 문자열이 올바른 괄호 문자열이라는 것은 다음을 의미합니다.
- $S$가 빈 문자열이면, $S$는 올바른 괄호 문자열입니다.
- $S$가 올바른 괄호 문자열이면, $S$의 앞뒤에 각각 ‘
(’와 ‘)’를 붙여 만든 문자열 “($S$)” 는 올바른 괄호 문자열입니다. - $S$와 $T$가 올바른 괄호 문자열이면, $S$와 $T$를 붙여 만든 문자열 “$ST$”는 올바른 괄호 문자열입니다.
- 위 세 규칙을 통해 만들 수 없는 문자열은 올바른 괄호 문자열이 아닙니다.
예를 들어, “(())()”, “()()”은 올바른 괄호 문자열이고 “)(”, “())(”는 올바른 괄호문자열이 아닙니다.
문자열 $S$가 주어집니다. $S$는 ‘(’, ‘)’, ‘?’, ‘*’로 이루어진 문자열입니다. ‘?’ 문자를 ‘(’이나 ‘)’로, ‘*’ 문자를 ‘(’와 ‘)’로 이루어진 길이가 $0$ 이상인 원하는 문자열로 대체하여 $S$를 올바른 괄호 문자열로 만들 수 있나요?
입력 형식
첫 줄에 테스트케이스의 수 $T$가 주어집니다. $(1 \le T \le 10\,000)$
각 테스트케이스의 첫 줄에는 ‘(’, ‘)’, ‘?’, ‘*’로 이루어진 길이가 $1$ 이상 $500\,000$ 이하인 문자열 $S$가 주어집니다.
입력에서 주어진 문자열 $S$의 길이 합은 $500\,000$을 넘지 않습니다.
출력 형식
각 테스트케이스마다 한 줄에 하나씩, ‘?’ 문자를 ‘(’이나 ‘)’로, ‘*’ 문자를 ‘(’, ‘)’로 이루어진 길이가 $0$ 이상인 원하는 문자열로 대체하여 $S$를 올바른 괄호 문자열로 만들 수 있다면 “YES”, 불가능하면 “NO”를 출력하세요.
예제 입력
4
()??))
())*(())
*)))(((*
?()(?*))(()?
예제 출력
YES
NO
YES
YES
Comments