https://programmers.co.kr/learn/courses/30/lessons/60058
함수는 두 개(splash, isBalanced)를 만들었다.
splash
는 균형잡힌 괄호 문자열로 나누는 u, v를 만들어주는 함수다. u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 한다. 그래서 앞에서부터 체크하다 갯수가 같은 쌍이 나오면 종료시켜버린다.
isBalanced
는 올바른 괄호 문자열인지 확인하는 함수다. 일단 이 함수를 어떻게 구현해야할지 고민하다, 실패했다. stack에 '('면 넣고, ')'면 빼는 아이디어를 캐치했다.
solution은 문제의 주어진 그대로 코딩하면 되는데, 재귀함수 구조를 아직 제대로 파악하지 못했다.
# txt => '균형잡힌 괄호 문자열'u & '균형잡힌 괄호 문자열'v
def splash(txt):
temp = ''
for i in range(len(txt)):
temp = txt[:i+1]
left_cnt = temp.count('(')
right_cnt = temp.count(')')
if (left_cnt == right_cnt):
u = temp; v = txt[i+1:]
return (u,v)
# 문자열 u가 올바른 괄호 문자열인지 확인하는 함수
def isBalanced(u):
stack = []
for p in u:
# p가 '('라면 stack에 추가
if p == '(':
stack.append(p)
# p가 ')'이면 stack에서 '('를 빼버림
# 아직 반복문이 다 돌기 전에 stack이 비어버리면 대칭이 맞지 않음
else:
if not stack:
return False
stack.pop()
return True
def solution(w):
# 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
if w == '':
return ''
# 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
u, v = splash(w)
# 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
if (isBalanced(u) == True):
# 3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
u +=solution(v)
return u
# 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
else:
# 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
temp = '('
# 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
v = solution(v)
# 4-3. ')'를 다시 붙입니다.
temp += v + ')'
# 4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
for p in u[1:len(u) - 1]:
if p == '(':
temp += ')'
else:
temp += '('
# 4-5. 생성된 문자열을 반환합니다.
return temp
# print(solution("(()())()"))
# print(solution(")("))
print(solution("()))((()"))