내가 시도한 방법
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()