All Articles

LeetCode - 20번 Valid Parentheses

LeetCode 20번 Valid Parentheses

문제

Given a string s containing just the characters ’(’, ’)’, ’{’, ’}’, ’[’ and ’]’, determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Example 1

Input: s = "()"
Output: true

Example 2

Input: s = "()[]{}"
Output: true.

Example 3

Input: s = "(]"
Output: false

Example 4

Input: s = "([)]"
Output: false

Example 5

Input: s = "{[]}"
Output: true

Constraints:

  • 1 <= s.length <= 104
  • s consists of parentheses only ’()[]{}‘.

내 풀이

class Solution:
  def isValid(self, s: str) -> bool:
    left = ["(", "{", "["]
    right = [")", "}", "]"]
    result = []
    if len(s) == 1 or s[0] in right:
      return False
    else:
      for i in s:
        if i in left:
          result.append(i)
        else:
          # "(){}}{" 같은 문자열 대비 
          if len(result) == 0:
            return False
          idx = right.index(i)
          if left[idx] == result[-1]:
            result.pop()
          else:
            result.append(i)
      if len(result) == 0:
          return True
      return False
  • Runtime: 32 ms, faster than 68.28% of Python3 online submissions for Valid Parentheses.
  • Memory Usage: 14.1 MB, less than 5.29% of Python3 online submissions for Valid Parentheses.

인풋 s와 비교하기 위해 왼쪽 괄호와 오른쪽 괄호를 나눠서 리스트를 만들어주고, s 문자열을 스택 자료구조로 쌓아줄 빈 리스트를 만든다.

만약 s가 괄호 하나로만 구성되어있거나, 오른쪽 괄호로 시작하면 False를 리턴해준다. True가 나올 수 없는 구조기 때문이다.

왼쪽 괄호는 무조건 스택에 넣고 오른쪽 괄호가 나왔을 때 스택의 가장 위 요소와 비교해 짝이 맞으면 스택에서 제거(pop)한다. 짝이 맞지 않으면 스택에 쌓는다. 스택에서 모든 괄호가 비워지면(=길이가 0이면) 괄호 짝이 맞는다는 이야기이므로 True를 리턴하고 그렇지 않으면 False를 리턴한다.

다른 사람 풀이

class Solution:
  def isValid(self, s):
    bracket_map = {"(": ")", "[": "]",  "{": "}"}
    open_par = set(["(", "[", "{"])
    stack = []
    for i in s:
      if i in open_par:
        stack.append(i)
      elif stack and i == bracket_map[stack[-1]]:
        stack.pop()
      else:
        return False
    return stack == []