백준 문제풀이
[백준] 9012번 괄호 [JAVA]
늦깍이
2022. 9. 13. 12:42
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
문제
문제 풀이
- 생각을 잘못해서 한 번 틀린 문제이다.
- 처음 생각,
1. size를 0으로 초기화한다.
2. '('의 경우 size에 1을 더해주고, ')'의 경우 size에 1을 빼준다.
3. size가 0이면 VPS이고, size가 1이면 VPS가 아니다. - 처음 생각의 잘못된 점 : VPS는 "()"가 한 쌍을 이룬다. 그치만 처음 생각으로 풀게 되었을 경우 ")("도 가능한 경우가 된다. 따라서 "()"만 가능한 경우로 다시 한 번 생각해 보도록 하자.
- 푼 방법 : 스택을 사용하기
1. 스택을 만든다.
2. 입력된 문자가 '('일 경우, stack에 push하고, ')'인 경우, stack을 pop한다.
*이렇게 해도 괜찮은 이유 : ')'가 먼저 시작하게 되면 결국 순서쌍이 ')('인 괄호쌍이 가능하다고 하는 꼴이기 때문에.
3. ')'가 더 많이 들어갈 경우, 예외처리 EmptyStackException을 하여 'NO'를 출력한다.
4. '('가 더 많이 들어갈 경우, stack의 size가 0보다 클 것이므로, stack.size() != 0인 경우 'NO'를 출력한다.
5. 마지막으로 두 경우가 다 아니면, VPS가 맞으므로 'YES'를 출력한다.
JAVA code[1] - 처음 틀렸던 생각.
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class baekjoon9012 {
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 str = br.readLine();
int length = str.length();
int size = 0;
for (int j = 0; j < length; j++) {
char ch = str.charAt(j);
if (ch == '(')
size++;
else
size--;
}
if (size == 0)
System.out.println("YES");
else
System.out.println("NO");
}
}
}
JAVA code[2] - 스택을 통한 풀이.
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.EmptyStackException;
import java.util.Stack;
public class baekjoon9012 {
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 str = br.readLine();
int length = str.length();
Stack<String> stk = new Stack<>();
String[] arr = new String[2];
for (int j = 0; j < length; j++) {
char ch = str.charAt(j);
try {
if (ch == '(')
stk.push("(");
else
stk.pop();
} catch (EmptyStackException e) {
arr[0] = "NO";
break;
}
}
if (arr[0] == "NO")
System.out.println("NO");
else if (stk.size() != 0)
System.out.println("NO");
else
System.out.println("YES");
}
}
}