https://www.acmicpc.net/problem/9012
from sys import stdin
T = int(stdin.readline())
for _ in range(T):
s = stdin.readline().strip()
stack = []
ans = "YES"
for i in range(len(s)):
if s[i] == "(":
stack.append(s[i])
elif s[i] == ")":
if stack:
stack.pop()
else:
ans = "NO"
break
if stack:
ans = "NO"
print(ans)
열린 괄호는 stack 에 저장하고
닫힌 괄호는 stack 에 값이 있으면 pop
stack 에 값이 없는데 닫힌 괄호가 들어왔거나 열린 괄호만 남을 경우 NO 출력

https://www.acmicpc.net/problem/7569
3 차원 배열이라 더 헷갈리고
재귀로는 너무 오래 걸릴 것 같아 풀지 못했다...
from sys import stdin
import collections
M, N, H = map(int, stdin.readline().split())
box = []
queue = collections.deque([])
for i in range(H):
h = []
for j in range(N):
l = list(map(int, stdin.readline().strip().split()))
h.append(l)
for k in range(M):
if l[k] == 1:
queue.append([i, j, k])
box.append(h)
dx = [-1,1,0,0,0,0]
dy = [0,0,1,-1,0,0]
dz = [0,0,0,0,1,-1]
while queue:
x, y, z = queue.popleft()
for i in range(6):
a = x+dx[i]
b = y+dy[i]
c = z+dz[i]
if 0 <= a < H and 0 <= b < N and 0 <= c < M and box[a][b][c] == 0:
queue.append([a,b,c])
box[a][b][c] = box[x][y][z]+1
ans = 0
for i in range(H):
for j in range(N):
for k in range(M):
if box[i][j][k] == 0:
print(-1)
exit(0)
ans = max(ans, max(box[i][j]))
print(ans-1)
토마토가 저장된 박스에 대한 정보를 box 에 모두 저장 => 3 차원 배열
queue 에 익은 토마토 정보를 모두 저장 => [i, j, k] 인덱스
위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향의 인접 인덱스를 확인하기 위해
dx, dy, dz 생성 => 반복문을 돌렸을 때, 차례대로 x, y, z +- 1 되도록 함
queue 의 값을 하나씩 pop 하면서 인접한 위치 중에 익지 않은 토마토가 있으면
queue 에 저장하고 box 값 + 1 로 update
=> 하루가 지나면 익는 토마토니까 저장
가능한 토마토들을 다 익게 만들었으면 다시 보면서 안 익은 토마토가 있는지 확인
있으면 -1 출력
없으면 최댓값으로 ans update
=> 가장 큰 ans 값이 최소 일수가 된다
냅다 외워!!!
