백준 2504 괄호의 값 : https://www.acmicpc.net/problem/2504
💡 아이디어
- stack에는 서로 다른 자료형이 함께 들어갈 수 있다.
- "(" 가 나왔을 때는 stack에 넣어주고,
")" 가 나왔을 때는 stack의 top이 무엇인지 확인한다.- top이 "(" 라면 "(" 를 pop한 후 2를 넣어준다.
- top이 숫자라면 그 수를 tmp에 저장해놓고 여는 괄호가 나올 때까지 나오는 모든 수를 더해준다.
- "("가 나오는 시점에 멈춰서 지금까지 더해진 temp 값에 2를 곱한 수를 다시 stack에 넣어준다.
# 괄호의값
import sys
brackets = list(sys.stdin.readline().strip())
stack = []
# 올바른 괄호인지 판단하기
def valid_brackets(brackets):
stack = []
for brack in brackets:
if brack == '(' or brack == '[':
stack.append(brack)
elif brack == ')':
if not stack:
return False
if stack[-1] == '(':
stack.pop()
else:
return False
else:
if not stack:
return False
if stack[-1] == '[':
stack.pop()
else:
return False
if not stack:
return True
else:
return False
# 연산 해주기
def num_sum(n):
rtn = 0
while True:
top = stack.pop()
if top == '(' or top == '[':
break
rtn += top
if rtn:
return rtn * n
else:
return n
# 올바른 괄호라면
if valid_brackets(brackets):
for brack in brackets:
if brack == '(' or brack == '[':
stack.append(brack)
elif brack == ')':
stack.append(num_sum(2))
elif brack == ']':
stack.append(num_sum(3))
print(sum(stack))
else:
print(0)
올바른 괄호인지에 대한 판단을 해주는데 '(' 경우와 '[' 경우를 나눠 각각 해주다보니 코드의 조건문이 굉장히 많아졌다.
num_sum() 함수는 블로그에서 참고한 풀이인데 연산하는 과정을 간결하게 구현한 점이 참고할만 하다.
import sys
from collections import deque
import copy
# sys.stdin = open("../test/paren-val.txt", "r")
parens = input().strip()
dq = deque()
stack = list()
for i in range(len(parens)):
dq.append(parens[i])
deq = copy.deepcopy(dq)
# 올바른 괄호인지 확인하기
def check():
while dq:
temp = dq.popleft()
if temp == "(" or temp == "[":
stack.append(temp)
else:
if temp == ")":
if stack and stack[-1] == "(":
stack.pop()
else:
return False
else:
if stack and stack[-1] == "[":
stack.pop()
else:
return False
if stack:
return False
return True
# 연산 해주기
def calc():
while deq:
temp = deq.popleft()
if temp == "(" or temp == "[":
stack.append(temp)
elif temp == ")":
if stack and stack[-1] == "(":
stack.pop()
stack.append(2)
else:
temp = stack.pop()
while stack and stack[-1] != "(":
temp += stack.pop()
stack.pop()
stack.append(temp*2)
else:
if stack and stack[-1] == "[":
stack.pop()
stack.append(3)
else:
temp = stack.pop()
while stack and stack[-1] != "[":
temp += stack.pop()
stack.pop()
stack.append(temp*3)
return sum(stack)
# 올바른 괄호라면
if check():
print(calc())
else: print(0)
팀원들과 함께 협업코딩하면서 짜본 코드이다. 내가 기획을 하고 코더를 팀원이 맡았다.
check() 함수가 굉장히 간결해졌다. 그 이유는 stack이 비어있는지 확인하는 과정에서 새로운 조건문을 만들지 않고
if stack and stack[-1] == "(":
이렇게 구현해서 코드의 가독성을 높였다.
연산을 담당하는 calc() 함수는 조금 더 풀어서 구현되었는데 사실 코드의 흐름은 이전 코드와 같다. 다만 함수 내부에서 for문을 만들어서 "(" 경우와 "[" 경우를 각각 조건문으로 구현해서 코드의 길이가 길어졌다.
하지만 가독성의 부분에서 더 이해하기 쉬운 코드인 것 같다.