기존 괄호 검사 문제의 응용버전인데 () = 2, [] = 3인데 (()) = 22 이며 [[]] = 33, [()[]] = (2+3) *3 일때 주어진 입력의 결과 값을 출력하면 된다. 올바르지 않은 괄호 배치이면 0을 출력한다.
def inspection(arr):
stack = list()
ans = 0
tmp = 1
#분배법칙을 이용해서 기본저긍로 (,[를 만나면 2 or 3을 곱해가다가 () or [] 짝이 맞으면
# ans에 저장 후 pop and tmp //2 or tmp//3을 함
# return 0 이 되는 조건은 기존 괄호검사 로직과 같음
for j in range(len(arr)):
if arr[j] == '(':
tmp *= 2
stack.append('(')
elif arr[j] == '[':
tmp *= 3
stack.append('[')
elif arr[j] == ')' and (len(stack) == 0 or stack[-1] != '('):
return 0
elif arr[j] == ']' and (len(stack) == 0 or stack[-1] != '['):
return 0
if arr[j] == ')':
if arr[j - 1] == '(':
ans += tmp
stack.pop()
tmp //= 2
elif arr[j] == ']':
if arr[j - 1] == '[':
ans += tmp
stack.pop()
tmp //= 3
if len(stack) != 0:
return 0
else:
return ans
print(inspection(input()))
[()[]] 일때 이것을 (2+3)*3으로 계산하려고 한다면 코드가 매우 복잡해진다. 분배 법칙을 이용해야 문제풀이가 용이하다. [()[]]을 (2+3)*3 이 아닌 3*2+3*3 으로 계산을 해야한다. 그렇기 때문에 먼저 (,[을 만나면 tmp에 2 or 3을 곱해주다가 ),]을 만나는데 바로 직전의 문자와 서로 짝이 맞다면 ans에 저장해주고 스택을 팝해주며 2 or 3으로 나누어준다. 0을 반환해주는 조건은 문자열이 끝났는데 스택이 비어있지 않거나 스택이 비었는데 )나 ]가 입력인 경우, 서로 짝이 맞지 않는 경우이다.