본문 바로가기

문돌이 존버/프로그래밍 스터디

(leetcode 문제 풀이) 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:
        mapping = {')':'(', ']':'[', '}':'{'}
        stack = []
        
        for char in s:
            if char not in mapping: # (, [, {
                stack.append(char)
            else:
                if not stack: # 처음에 ), ], } 가 들어온 경우
                    return False

                tmp = stack.pop()
                if mapping[char] != tmp:
                    return False

        if stack: # 스택이 남아있는 경우
            return False
        return True

본 문제는 프로그래머스인지, 어딘지 "괄호닫기"(?) 였나 하는 것으로 이미 풀어본 적이 있는 문제였다. 함정은 그럼에도 빠르게 풀지 못하고 계속 헤매었다는 것이다. 다양한 케이스가 있을텐데 그 경우를 생각하지 못하고 테스트 샘플만 보고 풀려다보니 그랬다.

생각치 못했던 케이스는 아래와 같다. 알고 나면 간단해보이지만 푸는 당시에는 생각나는 케이스가 없어서 틀리고 나서야 떠올렸다.

1. "("
2. "){}"
3. "(("

결론적으로 위의 3가지 경우를 생각해서 코드를 추가하니 통과할 수 있었다.

728x90
반응형