스택을 이용하여 풀이하는 문제다.
괄호의 모양이 바르게 구성된 올바를 문자열을 올바른 괄호 문자열(VPS)라고 부르는 데, 한쌍의 괄호로 된 문자열()을 기본 문자열 VPS, VPS인 x를 괄호 안에 넣은 (x)도 VPS, VPS인 x와 y를 접협시킨 xy도 VPS이다.
아이디어는
1. '('을 만나면 스택에 집어넣고, ')'을 만나면 이전에 넣은 '('을 스택에서 빼낸다.
2. 문자열 순회를 마쳤을 때 스택이 비어있으면 VPS 문자열, '('가 남아있다면 VPS가 아닌 문자열이 된다.
시퀀스 자료(String, Tuple, List)는 T/F값을 가지므로, 비어있는지 확인하기 위해서는
if not x:로 확인하면 된다.
-> 비어있으면 False, empty가 아니라면 True를 리턴한다.
for-else구문은 for문이 break없이 정상종료 되면 else의 코드를 실행한다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
stack = []
text = input()
for ch in text:
if ch == '(':
stack.append(ch)
else:
if stack:
stack.pop()
else:
print("NO")
break
else:
if not stack:
print("YES")
else:
print("NO")
# print("YES" if not stack else "NO")
2025.12.31 [백준 4949] 균형잡힌 세상
앞의 괄호문제와 비슷한 문제이다.
이전에 풀때와 다르게 is_balanced라는 트리거를 이용하여 결과가 출력되도록 코딩했다.
from collections import deque
import sys
input = sys.stdin.readline
while True:
stack = deque()
is_balanced = True
text = input().rstrip('\n') #sys.stdin.readline으로 받는 경우 '\n'가 함께 저장되므로 제거해줘야한다.
if text == '.':
break
for c in text:
if c == '(' or c == '[':
stack.append(c)
elif c == ')':
if not stack or stack[-1] != '(':
is_balanced = False
break
stack.pop()
elif c == ']':
if not stack or stack[-1] != '[':
is_balanced = False
break
stack.pop()
if is_balanced and not stack:
print("yes")
else:
print("no")