Algorithm/Simulation

[Python] 백준 2504번 괄호의 값

코딩쪼앙 2023. 5. 25. 01:00

문제

 

2504번: 괄호의 값

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

www.acmicpc.net

입력

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

출력

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

입력 예제

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

출력 예제

28

문제 풀이

  • 열린 괄호
    • 임시변수에 각 괄호 값에 맞는 값을 곱하고, 스택에 열린 괄호를 넣는다.
    • '('는 2를 곱하고, '['는 3을 곱한다.
  • 닫힌 괄호
    • 스택이 비었거나 괄호의 모양이 맞지 않는다면, 짝이 맞지 않으므로 결괏값을 0으로 바꾼 후, break한다.
    • 위 두 경우가 아닌 경우 짝이 맞는 것이다. 이 때 괄호를 입력 받은 리스트를 확인 해 바로 직전 값이 짝이 맞는 열린 괄호라면, 임시변수에 곱하는 것을 멈추고, 결괏값에 괄호가 열릴 때 마다 곱한 값(tmp)값을 더해준다.
    • 괄호가 닫혔다면, 다음 탐색을 위해 닫힌 괄호의 값만큼 임시 변수에서 다시 나눈다.
      • ']'는 3을 나누고, ')'는 2를 나눈다.
  • 위 과정을 모두 마친 후에도 스택에 괄호가 남아있다면, 이 경우도 짝이 맞지 않는 경우이므로 결괏값을 0으로 바꿔준다.
  • 모든 과정을 마쳤다면 결과를 출력한다.

코드

array = list(input())
stack = []
result = 0
tmp = 1

for i in range(len(array)):
    now = array[i]
    if now == '(':
        tmp *= 2
        stack.append(now)

    if now == ')':
        if not stack or stack[-1] == '[':
            result = 0
            break
        else:
            if array[i - 1] == '(':
                result += tmp
            tmp //= 2
            stack.pop()

    if now == '[':
        tmp *= 3
        stack.append(now)

    if now == ']':
        if not stack or stack[-1] == '(':
            result = 0
            break
        else:
            if array[i - 1] == '[':
                result += tmp
            tmp //= 3
            stack.pop()

# 짝 맞는 모든 괄호 소거 후 열린 괄호가 남아 있다면 짝이 맞지 않는 것
if stack:
    result = 0

print(result)