백준 2504 괄호의 값

고장난 고양이·2022년 7월 12일
0

알고리즘_python

목록 보기
50/84

문제

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.

한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.
만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.
X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.
예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.

‘()’ 인 괄호열의 값은 2이다.
‘[]’ 인 괄호열의 값은 3이다.
‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.

여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.

입력

첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.

출력

첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

예제 입력 1

(()[[]])([])

예제 출력 1

28

예제 입력 2

[][]((])

예제 출력 2

0

작성한 코드

sl=list(input())

def solution(sl):
    answer=0
    s=[]
    tmp=1
    for i in range(len(sl)):

        if sl[i]=='(':
            s.append(sl[i])
            tmp*=2
        elif sl[i]=='[':
            s.append(sl[i])
            tmp*=3
        elif sl[i]==')':
            if s[-1]=='(':
                s.pop()
                if sl[i-1]=='(':
                    answer+=tmp
                tmp//=2
            else:
                return 0
        else:
            if s[-1]=='[':
                s.pop()
                if sl[i - 1] == '[':
                    answer += tmp
                tmp//=3
            else:
                return 0


    return answer

print(solution(sl))

처음에는 괄호에따라 수식처럼 변형하여 계산을 진행할까 하였으나, 그러기엔 난이도가 너무 높다는 것을 파악하여 간단화하여 구현하는 것에 초점을 맞췄다.
예제 1번같은 경우
2(2+3(3))+2(3)으로 28이 나와야하는데,
이를 4+18+6으로 변형을 해서 대입하는 식으로 구현을 했다.
괄호를 시작하려고 할때, tmp에 값을 곱해 나갔고 괄호가 닫기 시작할때 answer에 반영했다. 그이후의 닫는 괄호는 tmp를 나눠 나가는역할만하였다.

하지만 이방식은 예외처리가 부족한 코드였는지 계속해서 런타임에러가 떳고 결국 다른 코드를 참고하였다.

참고한 코드

bracket = list(input())

stack = []
answer = 0
tmp = 1

for i in range(len(bracket)):

    if bracket[i] == "(":
        stack.append(bracket[i])
        tmp *= 2

    elif bracket[i] == "[":
        stack.append(bracket[i])
        tmp *= 3

    elif bracket[i] == ")":
        if not stack or stack[-1] == "[":
            answer = 0
            break
        if bracket[i-1] == "(":
            answer += tmp
        stack.pop()
        tmp //= 2

    else:
        if not stack or stack[-1] == "(":
            answer = 0
            break
        if bracket[i-1] == "[":
            answer += tmp

        stack.pop()
        tmp //= 3

if stack:
    print(0)
else:
    print(answer)

예외처리가 좀더 반영되어있는 코드같아 이대로 사용하였다.

profile
개발새발X발일지

0개의 댓글