괄호 문제는 스택 문제중에서도 흔한 유형에 속한다.
여는 괄호와 닫힌 괄호가 쌍을 이루고, 짝이 맞는다면 올바른 괄호 문자열 (Valid PS, VPS) 인 것이다.
(코드는 아래와 같다.-파이썬,python)
import sys
input = sys.stdin.readline
testcase = int(input())
for i in range(testcase):
bracket = []
stack = []
command = input()
bracket.append(command)
for j in command:
if j == "(":
stack.append(j)
elif j == ")":
if(len(stack) == 0):
break
else:
stack.pop(-1)
if(j == command[-1] and len(stack) == 0):
print("YES")
else:
print("NO")
bracket 이라는 리스트를 굳이 만들지 않고 command를 바로 탐색해도 된다.
로직은 입력값으로 괄호들을 입력받는다.
반복문을 통해서 괄호를 탐색하는데,
해당 탐색 괄호가 "(" 여는 괄호라면, stack 에 넣고
해당 탐색 괄호가 ")" 닫는 괄호라면, stack의 가장 끝 원소를 빼낸다.
VPS 에 해당하는 입력이라면, 끝까지 입력된 괄호들을 탐색할 것이고,
stack 의 길이는 0 일 것이다. (여는 괄호가 닫는 괄호와 쌍을 이루니까 쌓였던 여는 괄호는 다 없어졌을 것이다.)
이 때 주의할 점은,
")" 닫는 괄호가 처음부터 입력 될 수 있으니, stack의 길이가 0인 상태에서 탐색 괄호가 ")" 라면 바로 "NO"를
입력하도록 반복문을 빠져나오게 해야 한다.
(아래는 이전에 풀었던 자바 코드이다 - java)
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));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int i=0;i<T;i++) {
sb.setLength(0);
boolean isVPS = true;
String st = (br.readLine());
Stack<String> stack = new Stack<>();
for(int j=0;j<st.length();j++) {
if(st.charAt(j)=='('){
stack.push(String.valueOf(st.charAt(j)));
}
else if(st.charAt(j)==')') {
if(!stack.isEmpty() && stack.peek().equals("(")) {
stack.pop();
}
else {
isVPS = false;
break;
}
}
}
if(!stack.isEmpty()) {
isVPS = false;
}
if(isVPS) { // isVPS 가 true 이면
sb.append("YES");
System.out.println(sb.toString());
}
else {
sb.append("NO");
System.out.println(sb.toString());
}
}
}
}
반응형
'컴퓨터 공부 > 📚 Baekjoon(백준)' 카테고리의 다른 글
[백준/알고리즘/python/java] 1874번 - 스택 수열 (0) | 2021.02.13 |
---|---|
[백준/알고리즘/python/java] 4949번 - 균형잡힌 세상 (0) | 2021.02.13 |
[백준/알고리즘/python/java] 10773번 - 제로 (0) | 2021.02.13 |
[백준/알고리즘/python/java] 10828번 - 스택 (0) | 2021.02.13 |
[백준/알고리즘/python/java] 2004번 - 조합 0의 개수 (0) | 2021.02.12 |