[2504] 괄호의 값

문제

기존 괄호 검사 문제의 응용버전인데 () = 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을 반환해주는 조건은 문자열이 끝났는데 스택이 비어있지 않거나 스택이 비었는데 )나 ]가 입력인 경우, 서로 짝이 맞지 않는 경우이다.

좋은 웹페이지 즐겨찾기