2. 에서 끝에 잘린 부분: v는 빈 문자열이 될 수 있습니다.
isRight
은 문자열이 "올바른 괄호 문자열"인지 확인해주는 함수이다.stack
을 활용해서 문자가 '('이면 push
, ')'이면 pop
stack
이 비어있을 때 pop
을 하는 경우가 생긴다.# 문자열이 '올바른 괄호 문자열'인지 확인
def isRight(s):
stack = []
for c in s:
if c == '(':
stack.append('(')
elif c == ')':
if not stack:
return False
else:
stack.pop()
return True
# 문자열의 괄호 방향을 뒤집어서 리턴
def toggle(s):
s = s.replace('(', 'tmp')
s = s.replace(')', '(')
s = s.replace('tmp', ')')
return s
def solution(p):
# 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환
if not p:
return ''
# 2. 문자열 p를 두 "균형잡힌 괄호 문자열" u, v로 분리
u = ''
v = ''
if len(p) == 2:
u = p[:2]
else:
for i in range(2, len(p) + 1):
u = p[:i]
# 현재 u가 "균형잡힌 괄호 문자열"이라면
if u.count('(') == u.count(')'):
if i != len(p):
v = p[i:]
# 처음으로 "균형잡힌 괄호 문자열"이 되었을 때 그 문자열이 u가 되도록 바로 for문 탈출
break
# 3. 문자열 u가 "올바른 괄호 문자열"
if isRight(u):
# 3-1.
answer = u + solution(v)
# 4. 문자열 u가 "올바른 괄호 문자열"이 아닌 경우
else:
# 4-1 ~ 4-3
new_v = '(' + solution(v) + ')'
# 4-4
u = toggle(u.replace(u,u[1:len(u)-1]))
answer = new_v + u
return answer