////
Search

괄호의 값

소스코드

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를 사용하지 않고도 잘 작성해냈기에 꽤 만족스럽다.