leetcode 20 (easy)

김준오·2021년 11월 23일
0

알고리즘

목록 보기
75/91
post-thumbnail

문제

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

풀이1

class Solution:
    def isValid(self, s: str) -> bool:
        arr = []
        
        for a in s:
            if a in ['(', '{', '[']:
                arr.append(a)
                
            else :
                if len(arr) == 0:
                    return False
                
                temp = arr.pop()
                if (temp,a) not in [('(',')') , ('{','}') , ('[',']')]:
                    return False
                
        return True if len(arr) == 0 else False

풀이2

class Solution:
    def isValid(self, s: str) -> bool:
        d = {')':'(',
            '}':'{',
            ']':'['}
        
        arr = []
        for c in s:
            if c not in d:
                arr.append(c)
                
            else :
                if not arr or arr.pop() != d[c]:
                    return False
                
        return len(arr) == 0

배운점

if not arr or arr.pop() != d[c]:
return False
요 부분에서
처음에 arr.pop() != d[c] or not arr:

요렇게 순서를 바꿔서 해가지고 틀리는 바람에 한참 찾았다.

이렇게 할 경우 문제점이 있다.

  1. arr이 비어있을경우 pop연산이 우선 수행되면서 런타임에러가 난다.
    단축평가 라는 키워드로 검색해보면 관련 내용을 많이 알 수 있다.

  2. '()'
    이런 인풋에 대해서
    pop() != d[c]를 비교하는 과정에서 pop이 진행되어버렸기 때문에, or 을 지나 그 뒤에 not arr을 볼때 앞에 비교과정에서 pop한것때문에 길이가 0으로 잡혀서 not arr에 걸려버린다.

or 연산의 경우 각각을 보고 나중에 or 처리를 하는게 아니라 앞에서부터 한개씩 보면서 순차적으로 평가하기때문에 발생하는 문제다.

연산자 우선순위상 문제가 없어도 or 연산의 이런 단축평가 특성때문에 에러가 생길 수 있으니,
빈 배열인지 검사하는건 항상 먼저 해주도록 하자! 이 외에도 요런 특성은 알고있으면 좋을것같다.
지금까지 깊게 생각해본적 없었던 부분인데 좋은거 배웠다

결과

profile
jooooon

0개의 댓글

관련 채용 정보