Naver boostcamp -ai tech/알고리즘 풀이
BJ_ 2054 괄호의 값
끵뀐꿩긘
2022. 10. 3. 05:17
문제 링크
https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
문제 설명 / 풀이
생각해야 하는 부분
1. 이 괄호들이 올바른 괄호열인가? ex. (()[[]]) => 올바른 괄호열, ][[](]) => 올바르지 않은 괄호열
이 부분은 일반적으로 stack으로 풀 수 있다
2. 괄호열 규칙에 대한 계산 방법
() == 2, [] == 3, ([]) = 2*3, ([]()) = 2*(3+2)
같은 깊이의 괄호끼리는 덧셈으로 연산하고, 다른 깊이의 괄호끼리는 곱셈으로 연산한다
코드
import sys
string = sys.stdin.readline() # 괄호 문자열 받아오기
stack = [] # stack
l = [[] for i in range(16)] # 깊이에 따른 리스트
# 문자열의 길이가 1이상 30이하이므로 15개 + layer +1 연산의 OutofIndex 방지를 위해 1 = 16개
flag = 0 # 0: 올바른 괄호열, 1: 올바르지 않은 괄호열ㄹ
# 현재 layer까지 더해준다
def calculate_stack():
tmp = stack.pop()
layer = len(stack) # stack의 높이 == tmp가 들어가야 할 깊이
if l[layer + 1]: # 들어가야할 깊이보다 깊은 리스트에 값이 있으면
l[layer].append(tmp * sum(l[layer + 1])) # 모두 더해서 *
l[layer + 1] = [] # 깊은 리스트 초기화
else:
l[layer].append(tmp) # 없으면, 그냥 넣기
for i in string:
if i == '(': # 2추가
stack.append(2)
elif i == '[': # 3추기
stack.append(3)
elif i == ')': # stack에 값이 존재하고 2라면 올바른 괄호열이므로
if stack and stack[len(stack) - 1] == 2:
calculate_stack() # 깊이에 따라 적절한 list에 추기
else:
flag = 1 # 올바른 괄호열이 아니므로 break
break
elif i == ']':# stack에 값이 존재하고 3라면 올바른 괄호열이므로
if stack and stack[len(stack) - 1] == 3:
calculate_stack() # 깊이에 따라 적절한 list에 추기
else:
flag = 1
break
# stack에 값이 남았거나 올바른 괄호열이 아니라면 0
if flag or stack:
print(0)
else: # 올바른 괄호열이었다면, 1층 값 전체 더하기
print(sum(l[0]))
다른 사람의 풀이
s=str.replace
try:print(eval(s(s(s(s(s(input(),'()','+2'),'[]','+3'),'(','+2*('),'[','+3*['),']','][0]')))
except:print(0)
수학식을 계산해주는 eval과 try/except를 통해 깔끔히 풀었다.