괄호의 값

bird.j·2021년 8월 10일
0

백준

목록 보기
27/76

백준 2504

괄호의 값 구하기

  • 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.
  1. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.
  2. 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.
  3. X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.
  • 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.
  1. ‘()’ 인 괄호열의 값은 2이다.
  2. ‘[]’ 인 괄호열의 값은 3이다.
  3. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
  4. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
  5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
  • 첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
  • 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

입출력

입력출력
(()[[]])([])28
[][]((])0



접근 방식

: 스택을 사용한다는 것은 너무나 자명. 문제는 어떨 때 더하고 어떨 때 곱할 것인가?

알게된 점

  • '(' 나 '[' 일 때 스택에 저장
  • ')'일 때 '('를 만날때까지 pop해서 숫자들만 더해
    • top원소가 '('이어서 더할 값이 없으면 2 저장
    • 더한 최종 수에 2를 곱한 수를 스택에 다시 저장
  • ']'일 때 '['를 만날때까지 pop해서 숫자들만 더해
    • top원소가 '('이어서 더할 값이 없으면 3 저장
    • 더한 최종 수에 3을 곱한 수를 스택에 다시 저장


코드

sen = input()
stack = []

ans = 0
for s in sen:
    if s == '(' or s == '[':
        stack.append(s)

    elif s == ')':
        while stack:
            if stack[-1] == '(':
                if ans == 0:
                    stack.pop()
                    stack.append(2)
                else:
                    stack.pop()
                    stack.append(ans*2)
                    ans = 0
                break
            elif isinstance(stack[-1], int):
                ans += stack.pop()
            else:
                print("0")
                exit()
                
    elif s == ']':
        while stack:
            if stack[-1] == '[':
                if ans == 0:
                    stack.pop()
                    stack.append(3)
                else:
                    stack.pop()
                    stack.append(ans*3)
                    ans = 0
                break
            elif isinstance(stack[-1], int):
                ans += stack.pop()
            else:
                print("0")
                exit()

answer = 0
for s in stack:
    if isinstance(s, int):
        answer += s
    else:
        print("0")
        exit()
print(answer)
    
  • isinstance(원소, int) : 정수인지 확인
  • exit() : 프로그램 끝내기

0개의 댓글