제대로 된 괄호 문자열인지 판별하는 건 괜찮았지만, 계산하는 게 너무 어려웠다.
tmp에 1을 주고(곱했을 때 숫자가 살아있게 하기 위해서) 열린 괄호를 만날 때마다 2나 3을 곱해주고 stack이란 배열에 넣어준다. (배열에 넣어주는 이유는 짝이 맞는지 안 맞는지 찾기 위해)
닫힌 괄호를 만날 때마다 stack에 들어가 있는 마지막 괄호와 짝이 맞는다면 res에 그동안의 tmp 값을 더해준다.
그리고 tmp를 2로 나눠주는데, 그 이유는 (( 이렇게 괄호가 2개 있으면 2가 곱해지는 건 1번이므로 짝이 만들어졌다면 2로 나눠준다. 또한 stack에서도 마지막 괄호를 빼내줘야 한다.
참고 블로그 : https://dev-dain.tistory.com/149
s = input()
stack = []
tmp = 1
res = 0
for i in range(len(s)):
if s[i] == '(':
tmp *= 2
stack.append(s[i])
elif s[i] == '[':
tmp *= 3
stack.append(s[i])
elif s[i] == ')':
if not stack or stack[-1] == '[':
res = 0 # 제대로 된 괄호 아닌 경우
break
if s[i-1] == '(':
res += tmp # 짝을 찾았으므로 최종 결과에 더해줌
tmp //= 2 # (( 열린 괄호가 2개 있는 경우 2가 곱해지는 건 1번이므로 짝이 만들어졌다면 2로 나눠줘야
stack.pop() # pop도 까먹지 말고 꼭
else: # n[i] == "]"
if not stack or stack[-1] == '(':
res = 0 # 제대로 된 괄호 아닌 경우
break
if s[i-1] == '[':
res += tmp
tmp //= 3
stack.pop() # pop 까먹지 말기
if stack: # stack이 모두 pop되지 않아 비어있지 않은 경우 제대로 된 괄호가 아니므로 res = 0!
res = 0
print(res)