내가 시도한 방법
Indexerror가 뜨고...(이건 elif 문에서 stack이 빈 배열인지 아닌지 확인하는 부분을 한번만 적고 싶어서 섣불리 앞으로 뺐다가..빈 배열일 때에도 index접근을 허용해서 발생한 에러였다) 해결했는데 답이 틀렸다고 뜨고.....알고봤더니 소문자로 출력해야했는데 YES, NO로 print를 하고 있었다....ㅎㅎand와 or를 사용하면서 단축평가를 어떻게 고려해야할 지 연습해보는 기회가 됐다고 생각한다.def check(words):
stack = [] # 괄호들이 담길 배열
# 입력값 순회돌면서 확인하기(다만, 짝이 안맞는 경우가 발견되면 즉시 함수 종료)
for char in words:
# 괄호가 아닌 문자인 경우(그냥 pass)
if char not in '()[]':
continue
# 괄호 문자인 경우
if char in '([': # 여는 괄호,
stack.append(char) # (무조건) stack에 추가
elif stack and ((char == ')' and stack[-1] == '(') or (char == ']' and stack[-1] == '[')):
stack.pop() # 닫는 괄호면 짝 확인해서 stack에서 삭제(여는 괄호가 삭제됨)
else:
print('no') # 짝이 안맞으면 'no'출력하고
return # 함수 종료
# 입력값을 다 확인했을 때
if not stack: # 괄호의 짝이 다 맞은 경우
print('yes')
else: # 안맞은 경우
print('no')
return
import sys
words = sys.stdin.readline().rstrip()
while words != '.': # 입력값이 . 일 경우 순회 종료
check(words) # '.'이 아닌 값일 경우 괄호 검사하기
words = sys.stdin.readline().rstrip() # 다음 입력값으로 갱신
elif 부분elif (char == ')' and stack and stack[-1] == '(') or (char == ']' and stack and stack[-1] == '['):
stack.pop()
👇
# stack이 중복되서 앞에서 한번에 확인하자라는 생각이 들어서 아래와 같이 바꿨다.
# 그런데 stack 빈 배열일때에도 index 접근을 허용했다.
elif stack and (char == ')' and stack[-1] == '(') or (char == ']' and stack[-1] == '['):
stack.pop()
👇
# 최종코드
elif stack and ((char == ')' and stack[-1] == '(') or (char == ']' and stack[-1] == '[')):
stack.pop()