- refer : https://www.acmicpc.net/problem/4949
- 플랫폼 : BOJ (Silver 4)
- 특이사항 : Stack
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중조건 같이 다중조건의 경우 한번에 표현하려하지말고 상황별로 그냥 나누어서 작성하기
-> 수정 및 디버깅에 훨씬 용이하다