TIL) 2504 괄호의 값

Mongle·2020년 12월 23일
0

🧐 괄호의 값

백준 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문을 만들어서 "(" 경우와 "[" 경우를 각각 조건문으로 구현해서 코드의 길이가 길어졌다.
하지만 가독성의 부분에서 더 이해하기 쉬운 코드인 것 같다.

profile
https://github.com/Jeongseo21

0개의 댓글