10개의 게시글을 보았는데 스택에 숫자와 문자(, ), [, ]
가 모두 들어간 풀이들이 있었다. 하나의 Array에는 하나의 타입만 들어가야 한다고 생각해서 이런 방식을 습득하지 않았다.
아래의 코드에는 스택에 괄호만 들어간다.
예제 1번에 있는 (()[[]])([])
을 계산할 때 우리는 을 한다. 분배법칙을 사용하여 이 수식을 풀어보면 이 된다.
innerValue
에 값을 곱한다. 처음에 보면 이걸 대체 왜 하는 건지 의문이 든다🤔 일단 괄호를 열었기 때문에 안에 다른 괄호가 있을 것을 예상하고 행하는 것이다.(
와 [
만 있는데 짝이 안 맞을 때는 return 0
을 한다.()
나 []
라면 innerValue
를 result
에 더한다. 또 여기서 2나 3을 더해야 할 거 같은데 왜 하는 건지 의문이 든다🤔 여기서 innerValue
의 값을 이해하기 위해서는 (()...
일 때를 생각해보면 좋다. 안에 있는 ()
의 값은 가 된다. 여는 괄호에서 곱해준 값을 여기서 쓰는 것이다.()
나 []
처럼 쌍이 맞을 때만 하는 것이다.innerValue //= 2나 3
은 괄호를 닫았다는 뜻이다. 예를 들면 ((()))
이럴 때, 닫는 괄호를 지나갈 때마다 innerValue
의 값이 줄어들어야 한다는 것을 알 수 있다.import sys
input = sys.stdin.readline
def checkBalence(bracket: str) -> int:
result = 0
innerValue = 1
bracketStack = []
for index in range(len(bracket)):
if bracket[index] == "(":
bracketStack.append("(")
innerValue *= 2
elif bracket[index] == "[":
bracketStack.append("[")
innerValue *= 3
elif bracket[index] == ")":
if not bracketStack or bracketStack[-1] != "(":
return 0
if bracket[index-1] == "(":
result += innerValue
bracketStack.pop()
innerValue //= 2
else:
if not bracketStack or bracketStack[-1] != "[":
return 0
if bracket[index-1] == "[":
result += innerValue
bracketStack.pop()
innerValue //= 3
# print(
# f"result: {result} innerValue: {innerValue} stack {bracketStack}")
if not bracketStack:
return result
return 0
inputBracket = input().rstrip()
print(checkBalence(inputBracket))