소스코드
import sys
input = sys.stdin.readline
galhos = list(input().strip())
result = 0 # 결과값
temp_result = 1 # 괄호값을 임시 반영하기 위한 변수
stack = []
for i in range(len(galhos)):
galho = galhos[i]
if galho == '(':
stack.append(galho)
temp_result *= 2
elif galho == '[':
stack.append(galho)
temp_result *= 3
elif galho == ')':
if (not stack) or (stack[-1] != '('):
result = 0
break
if galhos[i-1] == '(':
result += temp_result
stack.pop()
temp_result //= 2
elif galho == ']':
if (not stack) or (stack[-1] != '['):
result = 0
break
if galhos[i-1] == '[':
result += temp_result
stack.pop()
temp_result //= 3
# 마지막 검증 : 아직 스택이 안 비었다면 0 출력
if stack:
print(0)
else:
print(result)
Python
복사
풀이
•
괄호 문제는 워낙 유명한 스택 자료구조를 사용하는 문제입니다.
•
여기서 괄호의 값 문제는 한 단계 더 상위의 난이도를 가지고 있는데, 괄호 생김새, 위치에 따라 곱셈이나 덧셈이 된다는 점입니다.
◦
다른 분들은 가장 안쪽의 값이 발생하는 지점에서 다시 바깥쪽으로 그 값을 전파시켜나가도록 스택을 구현하셨더라구요. 그러나 저는 수학적으로 푸는 방식밖에 생각이 안 나서 그렇게 풀어봤습니다 :
▪
어찌됐든 바깥의 괄호는 내부 값에 곱셈으로 적용됩니다. (()[[]])([]) 를 생각해볼까요? 왼쪽 부분은 2 x (2 + 3 x 3)이다보니, 내부의 값들은 결국 마지막에는 x2를 수행해야만 합니다.
▪
그렇다면, 열린괄호를 마주칠 때마다 곱하기를 해두면 어떨까요? 반대로 닫히는 괄호일때는 나누기를 해주면 됩니다. 그리고 닫힌 괄호의 경우, 괄호열의 바로 직전 괄호가 짝에 맞는 열린괄호일 경우에는 결과에 덧셈 처리해주시면 됩니다.
▪
처음 말했던 2 x (2 + 3 x 3)의 경우를 생각해보겠습니다. (2 x 2)와 (2 x 3 x 3)을 결과에 더해주는 셈입니다. 결론은 동일하죠. 그리고 결국 짝이 맞다면 닫힌 괄호들에 의해 나눗셈 연산도 이어서 진행되므로 이후의 연산에 영향을 주지 않습니다. 다시 1로 돌아갈테니까요.
•
또 마지막의 경우를 분기로 처리를 못 했는데요, 순회를 마치고도 여전히 스택에 괄호가 남아있을 수도 있습니다. 이 경우는 이전까지 값이 어떻게든 처리가 됐다 하더라도 결국엔 0을 출력해야만 합니다(스택에 괄호가 남았다는건, 짝이 안 맞다는 소리니까).
복기
•
이러한 문제(괄호, 크게 만들기)의 경우에는 모든 로직을 끝내고도 결론에 도달하지 않을 수 있음을 항상 염두에 두고 마지막까지 조심하는 버릇을 최대한 길러봐야겠다.
•
그래도 마지막 파트 제외하고는 AI를 사용하지 않고도 잘 작성해냈기에 꽤 만족스럽다.
