미식가의 개발 일기

[백준/Python] #2504번 괄호의 값 본문

Python/Algorithm

[백준/Python] #2504번 괄호의 값

대체불가 핫걸 2025. 4. 8. 23:38

문제 

  • 올바른 괄호열이란 '()'나 '([[]])'처럼 괄호가 짝을 맞춰 올바르게 배치된 문자열을 의미한다.
  • 괄호의 값 계산 조건
<괄호열 X, Y에 대해>
- ‘()’ 인 괄호열의 값은 2
- ‘[]’ 인 괄호열의 값은 3이다.
- ‘(X)’ 의 괄호값은 2×값(X) 
- ‘[X]’ 의 괄호값은 3×값(X) 
- 값(XY)= 값(X)+값(Y) 
- 올바르지 않은 괄호열이면 0 출력 

 

해결 방법

  • 열린 괄호는 스택에 넣어주고 닫힌 괄호는 스택에서 빼준다. 단, 스택이 비어있거나 스택에 마지막으로 들어온 값에 대응되는 괄호가 없다면 0을 answer로 지정한다.
  • 괄호 안 괄호에 대해서는 값이 "("이라면 2, "["라면 3을 tmp에 계속해서 곱해주고, ")", "]"로 바로 직전에 짝이 있다면  answer에 현재까지의 tmp 값을 더해준다. 그 다음 스택에서는 pop으로 쌍에 맞는 괄호 값을 지워주고 다시 tmp에서 각각 2와 3으로 나눠주며 계산을 반복한다.
  • 스택의 값이 비어있다면 모든 쌍이 다 맞다는 뜻이므로 answer 값을 출력하고, 그렇지 않다면 대응되지 않는 괄호가 있다는 의미이므로 0을 출력한다.

 

정답

import sys
input = sys.stdin.readline

def cal(s):
    answer = 0
    tmp = 1
    stack = []
    
    for i in range(len(s)):
        if string[i] == '(':
            stack.append('(')
            tmp *= 2
        elif string[i] == '[':
            stack.append('[')
            tmp *= 3
        elif string[i] == ')':
            if not stack or stack[-1] == '[':
                answer = 0
                break
            if string[i-1] == '(':
                answer += tmp
            stack.pop()
            tmp //= 2
        else:
            if not stack or stack[-1] == '(':
                answer = 0
                break
            if string[i-1] == '[':
                answer += tmp
            stack.pop()
            tmp //= 3
    
    if stack:
        print(0)
    else:
        print(answer)
        
if __name__ == "__main__":
    string = list(input().rstrip())
    cal(string)
반응형