관리 메뉴

Jerry

[leetcode][파이썬]Valid Parentheses #005 본문

Problem Solving/Algorithm 문제 풀기

[leetcode][파이썬]Valid Parentheses #005

juicyjerry 2024. 5. 22. 13:10
반응형

https://leetcode.com/problems/valid-parentheses/description/

 

 

 


 

 

 

 

오늘풀어본 문제는 " Valid Parentheses" 이다.

주어진 괄호 3가지 유형, 대괄호([ ]), 중괄호({ }), 소괄호(( ))을 일정 조건에 부합하지는 여부를 판단하는 문제이다. 

 

 

풀이 #1 - 딕셔너리(dictionary) + Stack

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        brackets = {
            "]": "[",
            "}": "{",
            ")": "(",
        }

        for bracket in s:
            if bracket in brackets:
                top_element = stack.pop() if stack else "#"
                if brackets[bracket] != top_element:
                    return False
            else:
                stack.append(bracket)

        return not stack

 

내가 고안한 방법은 brackets 딕셔너리를 만들어 파라미터로 주어진 괄호에 맞는 괄호가 나오지 않을 때 False 반환, 그렇지 않으면 True 반환하는 로직을 생각했었다. 되게 간단하게 생각했는데 반복문에서 인덱스를 이용해 현재 값과 이전에 나온 값에 매칭 여부를 판단하려고 하는 과정에서 약간의 어려움이 있었다.

 

예를 들어, 아래와 같은 방식이든 

if not stack or (len(stack) - 1 > 0 and brackets[stack[len(stack) - 1]] != bracket):
    stack.append(bracket)

 

 

 

이런 방식이었다.

if len(stack) - 1 >= 0 and brackets[stack[len(stack) - 1]] in list(brackets.keys()) and brackets[stack[len(stack) - 1]] == bracket:
    stack.pop()

 

if 조건문안에 하위 표현(sub-expression)을 했으면 됐는데, 문제를 풀어내는 것에 중점을 두는 것에 내 자신이 생각하는 이상적인 코드를 만들어 가겠다는 강박을 좀 버려야겠다.

또한, 배열이나 딕셔너리 사용할 때, 인덱스를 위주로 활용해 풀려는 경향이 있는 거 같다. 해당 자료구조를 잘 이해하고 있다고 생각하지만 아직 부족하다.  파이썬 문법도 아직 서투르다.

 

 

 

 

 

알게된 점

- stack 자료구조를 이용해 문제를 풀어나는 방식에 대해 알게 된 시간이었다.

 

 

 

 

반응형