백준 4949 파이썬 (stack)

CODA·2022년 7월 15일
0


python에서의 stack

  • c++에서와 달리 직접구현해야한다. 하지만 그냥 리스트에다가 append(push), pop()(pop) 하면된다. 간단
  • 리스트로 구현하는거다 보니 사실 인덱스로 접근이 가능하긴하다
  • 직면하는 문제가 stack을 쓰는 문제인지 상황판단이 중요한 것 같다
import sys
input = sys.stdin.readline

def isTrue(string):
    stack = []
    box = ['(','[',')',']']

    for elem in string :
        if elem not in box :
            continue

        if (elem == '(') or (elem == '[') :
            stack.append(elem)
        # else :

            '''
            <잘못된 코드1>
            if (elem == ')') and (stack.count('(') == 0 ): 
                return False
            if (elem == ']') and (stack.count('[') == 0 ):
                return False
            else :
                stack.pop()
            => 괄호간의 순서를 고려하지 않음
            => [) (] 이런경우를 못잡기 때문에 순서도 중요!
            '''

            '''
            <잘못된 코드2>
            if (stack) and (elem == ')') and (stack[-1] == '(') : # stack[-1]은 empty 경우 error 이므로 앞에 stack 조건을 추가
                stack.pop()
            if (stack) and (elem == ']') and (stack[-1] == '[') :
                stack.pop()   
            else :
                print(f'here elem : {elem} \t stack : {stack}, stack[-1] : {stack[-1]}')
                return False
            # => ()[] 이렇게 안끝났는데도 empty 여서 return false 될 수 있음
            # => 가정문에서 3중조건은 나눠서 작성하기..
            '''
            
        elif elem == ')':
            if stack and stack[-1] == '(':
                stack.pop()
            else:
                return False
        elif elem == ']':
            if stack and stack[-1] == '[':
                stack.pop()
            else:
                return False

    if len(stack) == 0 :
        return True
    else :
        return False
    


while True :
    
    # string = input()
    string = input().rstrip()

    if string == "." :
        break

    if isTrue(string):
        print('yes')
    else :
        print('no') 
   

느낀 점

  • 괄호 관련은 stack 대표예시라 떠올리는게 쉬웠지만, stack 사용 상황인지 판단이 중요 : 구현은 리스트를 이용함 굉장히 쉽다
  • if 조건문 쓸때는 3중조건 같이 다중조건의 경우 한번에 표현하려하지말고 상황별로 그냥 나누어서 작성하기
    -> 수정 및 디버깅에 훨씬 용이하다
profile
금융권에 가고싶은 김코다입니다. 취업을 하면 기타치며 조르바처럼 살고파요.

0개의 댓글