https://www.acmicpc.net/problem/2504
공부 날짜 : 2023.01.08
정답 참조 여부 : O
괄호로 이루어진 문자열이 주어지고 문제의 조건에 맞게 괄호를 수식으로 바꿨을 때 수식 결과 값을 출력하거나, 괄호쌍에 문제가 있으면 0을 출력하는 문제이다.
자료 구조의 개념도 필요하지만 수식을 계산할 수 있는 절차를 살짝 바꿔서 바라봐야 했다.
항상 수식은 중위 표기식으로만 생각해서 표기식을 좀 바꾸니 문제를 풀기 많이 어려웠다.
기본적으로 스택을 사용해서 괄호쌍을 체크는 해줄 수 있지만, 수식계산이 많이 어려워서 정답을 참고 했다.
정답에서는 괄호가 열리면 괄호 형태에 맞게 곱해주고 괄호가 닫히면 괄호의 값을 나눠주는 식으로 값을 저장했다.
그러던중 괄호가 쌍을 이뤄서 열리고 닫혔을 때 결과에 더해주는 식으로 해결했다.
수식을 순차적으로 보고 풀 수 있어야 할거 같다.
import sys
input = sys.stdin.readline
##########################################
input_data = input().rstrip()
stack = []
temp = 1
result = 0
# 인덱스 접근
for i in range(len(input_data)):
# 괄호가 열리면 숫자만큼 곱해주고 스택에 추가
if input_data[i] == "(":
temp *= 2
stack.append("(")
elif input_data[i] == "[":
temp *= 3
stack.append("[")
# 괄호가 닫힐 때
elif input_data[i] == ")":
# 스택의 마지막이 다른 괄호면 틀림
if len(stack) == 0 or stack[-1] == "[":
result = 0
break
# 단일 괄호로 숫자이면 결과에 더하기
if input_data[i-1] == "(":
result += temp
# 쌍에 이상없는 괄호면 나눠주기
temp //= 2
stack.pop(-1)
# 괄호가 닫힐 때
elif input_data[i] == "]":
# 스택의 마지막이 다른 괄호면 틀림
if len(stack) == 0 or stack[-1] == "(":
result = 0
break
# 단일 괄호로 숫자이면 결과에 더하기
if input_data[i - 1] == "[":
result += temp
# 쌍에 이상없는 괄호면 나눠주기
temp //= 3
stack.pop(-1)
if len(stack) != 0:
result = 0
print(result)