Algorithm

[SWEA][stack] 4866_괄호검사 (211019)

lluna 2021. 10. 19. 23:05

이해도

★★★★★

문제

접근방법

  • stack 이 빌 때까지 반복하며 여러 경우의 수를 처리한다.
  • 스택이 다 비면 1, 그렇지 않으면 0, 중간에 여러 경우의 수에 걸리면 0을 출력한다.
  • left 리스트의 인덱스와 right 리스트의 인덱스가 일치하면 짝이 맞는 괄호이다.

[경우의 수]

1. 스택은 비어있는데 우측 괄호가 나온 경우 ex. ) or }

2. 스택의 마지막 괄호와 다음 괄호의 인덱스가 다른 경우 ex. ({)

3. data를 다 돌았는데 stack이 남아있는 경우 ex. ) , } , )} , { ,...etc

 

나의 코드

  • while 반복문 사용
  • left, right 분리
T = int(input())
for tc in range(1, T+1):
    data = list(input())

    left = ['{', '(']
    right = ['}', ')']

    stack = [0]
    ans = 1
    while stack:
        stack = []
        for char in data:
            if (len(stack) == 0) and (char in right):
                ans = 0
                break
            if char in left:
                stack.append(char)
            if char in right:
                if left.index(stack[-1]) == right.index(char):
                    stack.pop()
                else:
                    ans = 0
                    break
        if stack:
            ans = 0
            break

    print(f"#{tc} {ans}")

 

for 반복문을 사용한 코드

좌측 괄호가 나온 경우에는 항상 append하고, 우측 괄호로 모든 경우의 수를 처리한다.

다음의 경우 False를 반환한다.

  • 우측 괄호를 만났는데 스택이 비어있는 경우
  • 우측 괄호를 만났는데 스택 마지막 괄호와 인덱스가 다른 경우
  • 다 돌았는데 스택이 남아있는 경우
def is_matched(text):
    lefty = '({'
    righty = ')}'

    stack = []
    for char in text:             
        if char in lefty:
            stack.append(char)
        elif char in righty:
            # isEmpty
            if len(stack) == 0:
                return False
            if righty.index(char) != lefty.index(stack[-1]):
                return False
            if righty.index(char) == lefty.index(stack[-1]):
                stack.pop()
    if len(stack):
        return False
    else:
        return True
    
    
T = int(input())
for tc in range(1, T+1):
    text = list(input())
    
    print(f"#{tc} {int(is_matched(text))}")