예외 케이스 처리 주의
이번엔 오른 괄호가 맨 처음 나온 경우를 빼 먹었었음. 아래는 틀린 코드
for index in range (len(check_str)):
# 오른 괄호도 stack 만들거나, 다 저장해 두고 역으로 계산하면 포함관계에서 오류.
# 오른 괄호 체크와 동시에 왼 괄호 stack 변경해 가면서 봐야 함
# stack 만들기, dict 이용하면 세련된 처리 가능
if check_str[index] in left_map:
data_stack.append (left_map[check_str[index]])
# stack과 체크 로직
elif check_str[index] in right_map:
if right_map[check_str[index]] == data_stack[-1]:
data_stack.remove(data_stack[-1]) #data_stack.pop(-1)
else:
break
if len(data_stack) == 0:
answer = 1
else:
answer = 0
print (f'#{test_case} {answer}')right_map 체크하는 루프의 else에 오른 괄호 가장 먼저 나오는 경우가 포함된다고 생각했지만, data_stack[-1] 에 접근하려고 먼저 시도하므로 data_stack이 비어있으면 바로 index 에러가 뜸 (더 큰 범위인 runtime error)
정답 코드: 예외 처리 더 꼼꼼하게 index 0, 길이 0일 때 한 번 더 생각.
T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
check_str = input().strip() # 공백 문자 무시
data_stack = []
left_map = {'(': 0, '{': 1, '[': 2}
right_map = {')': 0, '}': 1, ']': 2}
answer = 0
for index in range (len(check_str)):
# 오른 괄호도 stack 만들거나, 다 저장해 두고 역으로 계산하면 포함관계에서 오류.
# 오른 괄호 체크와 동시에 왼 괄호 stack 변경해 가면서 봐야 함
# stack 만들기, dict 이용하면 세련된 처리 가능
if check_str[index] in left_map:
data_stack.append (left_map[check_str[index]])
# 오른 괄호를 stack과 비교 로직 -> 오른쪽 가장 먼저 나왔을 때 예외 처리 로직!
elif check_str[index] in right_map:
if len(data_stack) == 0:
answer = 0
break
else:
if right_map[check_str[index]] == data_stack[-1]:
data_stack.pop(-1) #data_stack.remove(data_stack[-1])
if len(data_stack) == 0:
answer = 1
else:
answer = 0
break #여기에 stack 비었을 때는 포함이 안 됨... -> if 문 하나 더 쓰기
# 빈 스택 예외 처리 해도 런타임 넘어감 dict 때문이 아니라는데 왜?
print (f'#{test_case} {answer}')