Stacks: Balanced Brackets


bracket은 (), {}, [] 이 세가지를 모두 포함한다.
이것을 매칭하는 문제이다.

구현코드

def is_matched(expression):
    stack = []
    for bracket in expression:
        if bracket in ['[', '{', "("]:
            stack.append(bracket)
        else:
            if stack:
                if bracket == ']':
                    leftBracket = stack.pop()
                    if leftBracket != '[':
                        return False
                elif bracket == '}':
                    leftBracket = stack.pop()
                    if leftBracket != '{':
                        return False
                elif bracket == ')':
                    leftBracket = stack.pop()
                    if leftBracket != '(':
                        return False
            else:
                return False
    return True

t = int(input().strip())
for a0 in range(t):
    expression = list(input().strip())
    if is_matched(expression) == True:
        print("YES")
    else:
        print("NO")

실행결과

# Input
3
{[()]}
{[(])}
{{[[(())]]}}

# Output
YES
NO
YES
  • 하지만 이 방법은 runtime issue를 발생 시킨다.

새로운 솔루션

def is_matched(expression):
    stack = []
    for bracket in expression:
        if bracket == '{':
            stack.append('}')
        elif bracket == '[':
            stack.append(']')
        elif bracket == '(':
            stack.append(')')
        else:
            if len(stack) == 0 or bracket != stack[-1]:
                return False
            stack.pop()
    return len(stack) == 0

t = int(input().strip())
for a0 in range(t):
    expression = input().strip()
    if is_matched(expression) == True:
        print("YES")
    else:
        print("NO")

Dictionary를 이용한 방법

Advantage

  • 다른 bracket을 필요로 하다면 쉽게 확장이 가능하다.
  • if-else 또는 switch case를 다중으로 작성할 필요가 없다.
  • O(1) call time을 가진다 (hash table이니 당연한 말이긴 하다).
def is_matched(expression):
    stack = []
    dicty = {'(':')', '[':']', '{':'}'}
    for x in expression:
        if x in dicty:
            stack.append(dicty[x])
        elif stack and x == stack[-1]:
            stack.pop()
        else:
            return False
            
    return not stack

t = int(input().strip())
for a0 in range(t):
    expression = input().strip()
    if is_matched(expression) == True:
        print("YES")
    else:
        print("NO")


'Computer Science > Coding Interview' 카테고리의 다른 글

Binary Search Tree  (0) 2017.07.31
HackerRank Queues: A Tale of Two Stacks  (0) 2017.07.30
Stacks: Balanced Brackets  (0) 2017.07.30
HackerRank Data Structure  (0) 2017.07.30
HackerRank MergeSort Counting Inversions  (0) 2017.07.29
Binary Search  (0) 2017.07.28

+ Recent posts