문제출처: https://www.acmicpc.net/problem/9012
괄호 문자열이 입력 값으로 들어 오는데 올바른 괄호로 구성 되어 있는지 확인하는 문제 이다.
첫번쨰 확인할 점: () 열린 괄호의 쌍이 잘 맞는지
두번째 확인할 점: (())), ((( 괄호의 쌍의 갯수가 잘 맞는지
예제 입력
6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(
3
((
))
())(()
예제 출력
NO
NO
YES
NO
YES
NO
NO
NO
NO
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));
int total = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < total; i++) {
Stack<Character> st = new Stack<>();
String s = br.readLine();
boolean print = false;
for(int j = 0; j < s.length(); j++) {
if(s.charAt(j) == '(')
st.push(s.charAt(j));
else{
if(st.isEmpty()) {
sb.append("NO\n");
print = true;
break;
} else
st.pop();
}
}
if(!print) {
if(st.isEmpty())
sb.append("YES\n");
else
sb.append("NO\n");
}
}
br.close();
System.out.println(sb);
}
}
스택에 넣어서 해결하면 되는 문제이다.
'('괄호이면 스택에 넣고 ')'이면 스택에서 꺼낸다.
')'일때 스택이 비어있으면 짝이 맞지 않으므로 바로 NO를 출력하고 모든 문자열 스캔을 마친 후 스택이 비어있으면 YES를 리턴한다.
만약에 모든 문자열 스캔을 마친후 스택이 비어 있지 않으면 역시 NO를 리턴한다.