💡 문제
💬 입출력 예시
📌 풀이(소스코드)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
sb.append(process(br));
}
System.out.println(sb);
}
private static String process(BufferedReader br) throws IOException {
String s = br.readLine();
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 (stack.isEmpty()) {
return "NO\n";
}
stack.pop();
}
}
if (stack.isEmpty()) {
return "YES\n";
}
return "NO\n";
}
}
📄 해설
접근
- 스택을 활용한 대표적인 괄호 문제.
- 여는 괄호
(
와 닫는 괄호 )
를 만났을 때에 대한 처리를 다르게 해주면 된다.
- 여는 괄호
(
를 만나면 스택에 push 하고, 닫는 괄호를 만나면 스택에서 pop 하는 것이 기본 접근.
- 닫는 괄호의 경우는 스택이 비어있는지도 확인해야한다. 스택이 비어있을 때 pop 을 해버리면 예외가 발생하기도 하고, 애초에 문제에서 찾고 있는 VPS 가 아니기 때문이다.
과정
process()
메소드를 제외하고는 설명할 것이 없으므로 해당 메소드에 대한 설명만 하고 넘어가도록 하겠다.
- 문자열을 반환하는 메소드로, 입력 받은 문자열이 VPS가 아닌경우
NO
를 반환하고, VPS 인 경우 YES
를 반환하는 메소드
- 앞서 설명했듯이 여는 괄호
(
를 만나면 바로 스택에 push 를 해주고, 닫는 괄호 )
를 만나면 스택이 비어있는지를 먼저 확인한다.
- 스택이 비어있으면
NO
를 반환한다. 여는 괄호가 존재하지 않는 상태이므로, VPS가 아니기 때문이다. 또한 앞서 말한대로 예외가 발생할 것이다.
- 스택이 비어있지 않으면 스택에서 pop 한다.
- 문자열의 문자를 다 확인했는데도 스택이 비어있지 않다면 VPS가 아닌 것이므로
NO
를 반환하고, 비어있다면 괄호의 짝이 맞는 문자열. 즉, VPS 이므로 YES
를 반환한다.