pair = {')' : '(', '}' : '{', ']' : '['}
def check(s) :
answer = 0
stack = []
for sign in s :
if sign in '({[' : stack.append(sign)
elif stack and stack[-1] == pair[sign] : stack.pop()
else : return 0
if not stack : answer += 1
return 0 if stack else answer
def solution(s) :
s = s+s
for i in range((n := len(s)//2)) :
if (answer := check(s[i:i+n])) == 0 : continue
return answer
return 0
풀이
사실 회전해가면서 셀필요없는 문제다.
괄호가 모두 올바르게 구성되어있다면 회전시켜가며 얻을 수 있는 올바른 괄호의 경우의 수는 올바른 괄호 덩어리 개수와 같다.
([{}]){()}() : ABC
()([{}]){()} : CAB
{()}()([{}]) : BCA
3가지
즉, 문제를 다시 정리하면
- 괄호를 회전시키면 올바르게 나오는 경우가 존재하는가?
- 존재한다면 덩어리 개수를
return
- 올바른 경우가 안나오면
return 0
을 해주면된다.
pair = {')' : '(', '}' : '{', ']' : '['}
def check(s) :
answer = 0
stack = []
for sign in s :
# 열린 괄호는 무조건 stack에 append
if sign in '({[' : stack.append(sign)
# 이전 괄호와 짝이 맞다면 이전 괄호 pop
elif stack and stack[-1] == pair[sign] : stack.pop()
# 올바른 괄호가 없는 케이스 return 0
else : return 0
# stack이 empty면 덩어리하나가 완성되었다는 뜻
if not stack : answer += 1
return 0 if stack else answer
def solution(s) :
s = s+s
for i in range((n := len(s)//2)) :
if (answer := check(s[i:i+n])) == 0 : continue
return answer
return 0