처음 이 문제를 접했을때 스택 또는 큐로 풀어야겠다는 생각은 들었으나 어떻게 활용해서 해결해야할지는 쉽게 감이 잡히지는 않았다.
앞에서부터 for 문으로 돌려서 하는 방법을 처음에 생각했는데 각 케이스별로 처리를 해주는 것이 쉽지 않다고 생각이 들었다.
그래서 뒤에서부터 처리하는 stack.pop 을 통해 문제를 해결해야겠다고 생각했다.
처음에 작성한 코드는
def solution(s):
answer = True
stack = list(s)
r = 0
rcheck = False
while(stack):
c = stack.pop()
if c == ')':
r+=1
rcheck = True
if c == '(':
#이전에 ')'가 나왔었다면
if rcheck:
r-=1
#해당 '('로 인해 더이상 남는 ')'가 없다면
if r == 0:
rcheck = False
else:
answer = False
return answer
이 코드인데 제출해본 결과 테스트케이스 딱 한개에서 걸렸다,,,,
그래서 어떤 예외가 있을지 곰곰히 생각해보다가 ')'의 개수를 세는 r을 '('을 만나면 빼주어 답이 True 일 때에는 r이 항상 0이 나와야 되는데 이 부분에 대해서 처리를 해주기로 생각했다.
def solution(s):
answer = True
stack = list(s)
r = 0
rcheck = False
while(stack):
c = stack.pop()
if c == ')':
r+=1
rcheck = True
if c == '(':
#이전에 ')'가 나왔었다면
if rcheck:
r-=1
#해당 '('로 인해 더이상 남는 ')'가 없다면
if r == 0:
rcheck = False
else:
answer = False
if r!= 0 :
answer = False
return answer
이렇게 해서 문제를 해결해 주었다.
관건은 이전에 ')'가 나왔었는지 체크해주는 rcheck와 그 개수를 세주는 r 이라는 변수를 두어 이전에 ')' 이 괄호가 나왔고 이것의 개수에 맞게 '(' 가 왔는지를 처리해주는데에 중점을 두었다.