class Solution:
def isValid(self, s: str) -> bool:
if len(s)%2==1 : return False
if len(s)==0 : return False
str_dic = {
')' : '(',
'}' : '{',
']' : '['
}
v_list = []
for i in s :
if i in str_dic.values() :
v_list.append(i)
else :
if v_list and v_list[-1] == str_dic[i] :
v_list.pop()
else : return False
if v_list : return False
return True
첫 번째로, 우선 홀수일경우는 괄호의 짝이 맞지 않으므로 무조건 False
이고,
문자열의 길이 역시 최소 1이기 때문에
아무것도 안들어온 빈 문자열일 시 False
를 리턴하도록 설정
두 번째로, 처음에는 여는 괄호를 Key
로 하고 닫는 괄호를 Value
로 하려 했는데 Stack
을 통해
넣고 빼고 했을 때 반대로 하는 게 나한테는 덜 헷갈려서 순서를 바꿈
세 번째로, value
의 리스트를 담기 위해 빈 리스트인 v_list
선언
네 번째로, 문자열 s
를 반복문 돌릴 때 그 문자열이 value
에 있는 거라면 v_list
에 추가
다섯 번째로, 만약 value
에 없다면(여는 괄호라면) 이 부분에서 되게 헷갈렸다
문제를 제대로 읽지 않아 여는 괄호가 들어간 역순에 맞게 닫히는 걸 못 봤기 때문이다.
말 그대로 stack
의 특징을 나타낸 문제였음
그래서 v_list
의 마지막 값과 반복문을 통해 얻은 문자열을 통해 얻은 value
값이 같을 경우
v_list
에서 한 개씩 빼내었다.
마지막으로, 값이 다를 경우 stack
의 특징을 어긴것이므로 False
가 리턴되고 v_list
가 남아있을 경우도 마찬가지다
stack
의 특징에 맞춰 짝맞게 다 없어져야 하는데 남아있는 게 있다는 것이기 때문이다.
이 모든 False
조건을 빗겨갔다면 자신있게 True
리턴