https://school.programmers.co.kr/learn/courses/30/lessons/60058
문제를 이해하는데 시간이 많이 걸렸던것 같다.
특히 문제에서 "괄호방향을 뒤집어서" 라는 말을 잘못 이해했다.
문자의 순서바꾸기 XXX 괄호 모양 뒤집기 OOO
"))(()(" ➡ "()(())" (X)
"))(()(" ➡ "(())()" (O)
문자열을 거꾸로 뒤집으라는 뜻이 아닌 즉, ) ➡ ( , ( ➡ ) 로 뒤집으라는 의미였다.
def solution(p):
if p == '':
return ''
# 문자열 분리
u,v = split_bracket(p)
# u가 올바른 문자열인지 체크
perfect = check_perfect(u)
# 올바른 문자열일때
if perfect:
# v에 대해 재귀 수행
result = solution(v)
answer = u+result
# 올바른 문자열이 아닐때
else:
# v에 대해 재귀 수행
result = solution(v)
result = '('+result +')'
arr=list(u[1:-1])
# ) ➡ ( , ( ➡ ) 로 뒤집기
for i in range(len(arr)):
if arr[i] == '(':
arr[i] = ')'
elif arr[i] == ')':
arr[i] = '('
u= ''.join(arr)
answer = result+u
return answer
# 올바른 괄호 문자열인지 체크
def check_perfect(u):
stack = []
if u[0] == ')':
return False
stack.append(u[0])
for i in range(1,len(u)):
if stack[-1] == u[i]:
stack.append(u[i])
else:
stack.pop()
if len(stack)>0:
return False
else:
return True
# 균형잡힌 괄호 문자열로 나누기
def split_bracket(p):
stack = []
l_bracket = 0
r_bracket = 0
for i in p:
if i == '(':
l_bracket += 1
stack.append(i)
else:
r_bracket += 1
stack.append(i)
if l_bracket == r_bracket:
break
return p[:len(stack)], p[len(stack):]