9012번: 괄호 [JAVA]
https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
1) BufferedReader 사용 (230817 다시 풀어봄)
접근 방식)
1. Character 스택 만들어서 T 만큼 반복문 수행
2. 현재 문자열 길이만큼 반복문 수행
2-1. 현재 char가 '(' 면 stack에 push
2-2. 현재 char가 ')' 인데
2-2-1. stack이 비어있다면 noFlag = true 바꾸고 break;
2-2-2. stack.peek() == '(' 라면, stack.pop()
2-2-3. stack.peek() == ')' 라면, noFlag = true 바꾸고 break;
3. 반복문 완료했을 때, 스택이 비어있고 && noFlag변수가 false라면 → YES / 아니면 → NO
package tony_git.data_structure;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class B_9012 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
Stack<Character> stack;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
String s = br.readLine();
stack = new Stack<>();
boolean noFlag = false;
for (int j = 0; j < s.length(); j++) {
noFlag = false;
char now = s.charAt(j);
if (now == '(') {
stack.push(now);
} else {
if (stack.isEmpty()) {
noFlag = true;
break;
} else if (stack.peek() == '(') {
stack.pop();
} else {
noFlag = true;
break;
}
}
}
if (stack.isEmpty() && !noFlag)
sb.append("YES").append('\n');
else
sb.append("NO").append('\n');
}
System.out.println(sb);
}
}
2) Scanner 사용 (230718 solve)
접근 방식)
1. Character 스택 만들어서 T 만큼 반복문 수행
2. 현재 문자열 길이만큼 반복문 수행
2-1. 현재 char가 '(' 면 stack에 push
2-2. 현재 char가 ')' 인데 stack이 비어있다면 break;
(→ 3번 StringBuilder에 NO로 추가되게 하기 위해서 stack에 현재 문자열 push해주고 break)
2-3. 그 외상황이라면 [현재 char가 ')'이고, stack 맨 위에 있는건 '('인 상황] pop
3. 스택 상태를 확인해서 비어있다면 StringBuilder에 YES추가. 아니라면 NO 추가
package tony_git.data_structure;
import java.util.*;
public class B_9012 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
Stack<Character> stack;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
String s = sc.next();
stack = new Stack<>();
for (int j = 0; j < s.length(); j++) {
char now = s.charAt(j);
if (now == '(')
stack.push(now);
// ')'이고 stack 비어있으면 NO라고 출력해주기 위해 push하고 break;
else if (stack.isEmpty()) {
stack.push(now);
break;
} else
stack.pop();
}
if (stack.isEmpty())
sb.append("YES").append('\n');
else
sb.append("NO").append('\n');
}
System.out.println(sb);
}
}