예외 케이스 처리 주의

이번엔 오른 괄호가 맨 처음 나온 경우를 빼 먹었었음. 아래는 틀린 코드

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}')