https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
풀이
대표적인 스택 문제다. '(' 왼쪽 괄호를 만나면 스택에 push하고, ')' 오른쪽 괄호를 만나면 스택을 pop한다.
이 때 ')' 오른쪽 괄호를 만나면 스택을 pop했는데 pop한 문자열이 ( 가 아니라면 올바른 괄호 문자열이 될 수 없다.
로직
1. n을 입력받는다.
2. n번 동안 괄호 문자열을 입력받고 blankStr(str)을 호출하여 올바른 괄호 문자열인지 검사하고 그에 따라 YES 또는 NO를 출력한다.
boolean blankStr(String str) : 주어진 괄호 문자열이 올바른 괄호 문자열이면 true, 아니면 false 리턴
public static boolean blankStr(String str) {
Stack<Character> st = new Stack<>();
for (char ch : str.toCharArray()) {
// '('를 입력하면 push
if (ch == '(')
st.push(ch);
// ')' 입력하면 pop했을 때 (가 아니거나 빈 스택이면 false 리턴
else {
if (st.isEmpty() || st.pop() != '(')
return false;
}
}
return st.isEmpty();
}
1) 문자열을 char 배열로 바꾼다음 각 문자마다 다음을 수행한다.
2) '(' 를 입력하면 push
3) ')' 를 입력하면, 스택이 비었거나 pop한 문자가 '(' 가 아니라면 false 리턴
4) for문 수행 후, 스택이 비어있으면 true 리턴, 아니면 false 리턴
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
while(n-- > 0) {
String str = br.readLine();
bw.write(blankStr(str) ? "YES" : "NO");
bw.write("\n");
}
bw.flush();
bw.close();
br.close();
}
public static boolean blankStr(String str) {
Stack<Character> st = new Stack<>();
for (char ch : str.toCharArray()) {
// '('를 입력하면 push
if (ch == '(')
st.push(ch);
// ')' 입력하면 pop했을 때 (가 아니거나 빈 스택이면 false 리턴
else {
if (st.isEmpty() || st.pop() != '(')
return false;
}
}
return st.isEmpty();
}
}
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1874번 : 스택 수열 - 자바[Java] (1) | 2022.09.25 |
---|---|
[백준] 1021번 : 회전하는 큐 - 자바[Java] (0) | 2022.09.24 |
[백준] 2468번 : 안전영역 - 자바[Java] (0) | 2022.09.24 |
[백준] 5212번 : 지구 온난화 - 자바[Java] (1) | 2022.09.23 |
[백준] 20436번 : ZOAC 3 - 자바[Java] (0) | 2022.09.23 |