import sys
input = sys.stdin.readline
def BOJ2504() :
def is_good(args) :
stack = []
flag = True
for arg in args :
if arg == '(' :
stack.append('(')
if arg == ')' :
if not stack:
flag = False
break
if stack[-1] != '(' :
flag = False
break
stack.pop()
if arg == '[' :
stack.append('[')
if arg == ']' :
if not stack :
flag = False
break
if stack[-1] != '[':
flag = False
break
stack.pop()
if len(stack) != 0 :
flag = False
return flag
def get_num(args) :
ans = 0
while args :
s = args.pop()
if s == '(' or s == '[' :
ans += get_num(args)
if s == ')' :
return 2 * max(1, ans)
if s == ']' :
return 3 * max(1, ans)
return ans
s = list(input().strip())
if(is_good(s)) :
result = get_num(s[::-1])
print(result)
return
print(0)
return
BOJ2504()
풀이 접근 방법 :
1. 입력이 정상적인 괄호식인지를 먼저 체크한다.
2. 정상적인 입력일 때만 계산 하는 로직을 수행하게 된다.
3. 계산하는 로직에는 재귀함수를 사용하고 싶었다.
(()[[]])([])
를 만날경우
( 혹은 [ 를 만나면 재귀함수가 실행되는 형식이다.
) 혹은 ] 를 만났을때는 값을 리턴해주면 된다.
(()) 의 경우 함수는 총 두번 실행된다.
바깥의 ( 에서는 내부의 결과인 2를 가지고 있어야 한다.
이를 위해 현재 실행컨텍스트에서의 ans 변수는 재귀 함수의 결과값을 리턴 받아 자신의 값을 더하게 된다.
이 과정을 입력받은 괄호식의 전체를 순회할 때 까지 반복하게 된다.
https://www.acmicpc.net/problem/2504
'알고리즘' 카테고리의 다른 글
빙산 [백준 1062] - python (0) | 2022.03.27 |
---|---|
빗물 [백준 14719] - python (0) | 2022.03.26 |
별자리 만들기 [백준 4386] - python (0) | 2022.03.24 |
전기가 부족해 [백준 10423] - python (0) | 2022.03.23 |
stack 두개로 queue 만들기 (0) | 2022.03.22 |