스택을 구현하고 사용해 봅시다.
Java / Python
위와 같은데 괄호의 종류가 다양해진 문제
이번 문제는 저번 괄호 문제(9012번)보다 업그레이드 된 문제입니다.
9012번에서 대괄호를 추가해, 조건만 수정하면 됩니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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();
String str;
while(true) {
str = br.readLine();
if(str.equals(".")) { // 종료 조건문
break;
}
sb.append(solve(str)).append('\n');
}
System.out.println(sb);
}
public static String solve(String s) {
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i); // i 번째 문자
if(c == '(' || c == '[') { // 여는 괄호 경우, 스택에 push
stack.push(c);
}else if(c == ')') { // 닫는 소괄호 경우
// 스택이 비어있거나 pop할 원소가 소괄호랑 매칭이 안되는 경우
if(stack.empty() || stack.peek() != '(') {
return "no";
}
else {
stack.pop();
}
}
else if(c == ']') {
// 스택이 비어있거나 pop할 원소가 대괄호랑 매칭이 안되는 경우
if(stack.empty() || stack.peek() != '[') {
return "no";
}
else {
stack.pop();
}
} // 그 외 문자는 상관 X
}
if(stack.empty()) {
return "yes";
}
else {
return "no";
}
}
}
while True:
s = input()
if s == '.':
break
stack = []
result = True
for c in s:
if c == '(' or c == '[':
stack.append(c)
elif c == ')':
if not stack or stack[-1] == '[':
result = False
break
elif stack[-1] == '(':
stack.pop()
elif c == ']':
if not stack or stack[-1] == '(':
result = False
break
elif stack[-1] == '[':
stack.pop()
if result == True and not stack:
print('yes')
else:
print('no')