문제에서 설명해준 방법그대로 따라가면 되지만 재귀함수에대한 어느정도 친숙함이 있지않다면 결코 쉽게 이해하지 못했을 것이다. 따라서 이문제는 논리적으로 해결 방법을 찾아가기 보다
결국 이 문제의 핵심 해결 방법은 평소 재귀함수의 실력과 재귀적 사고실력을 기반으로 문제를 독해해 나가며 이해하고 그 이해를 기반으로 천천히 구현해가면 되는 문제였다!!!!!
def seperate(p,size):
#최소한의 u랑 v로 나누기
tmp = 0
for i in range(size):
if p[i] == ')':
tmp -= 1
elif p[i] == '(':
tmp += 1
#균형잡힌 문자열이 완성되었을 때 u랑 v로 나눠주기
if tmp == 0:
u = p[0:i+1]
v = p[i+1:]
break
return u,v
#올바른 괄호인지 판단해주는 함수
def is_right(s):
tmp = 0
for c in s:
if c == '(':
tmp += 1
elif c == ')':
tmp -= 1
if tmp < 0:
return False
return True
def solution(p):
answer = ''
#빈 문자열 이라면
if p == '':
return ''
size = len(p)
#최소한의 u랑 v로 나누기
u, v = seperate(p,size)
#u가 올바른 괄호면 answer에 붙여주기
if is_right(u) == True:
answer += u
#v에대해 올바른 괄호 만들기
answer += solution(v)
#u가 올바른 괄호가 아니라면 다음 과정해주기
else:
#u를 올바른 괄호로 만들어 준 후 그u를
#1. 앞에 '('를 붙인다.
answer += '('
#2 v에 대해 sol함수 수행결과를 붙인다.
answer +=solution(v)
#3 뒤에 ')'를 붙인다.
answer += ')'
#4 u의 앞뒤를 자르고 뒤집어준 녀석을 붙여준다.
u = u[1:len(u)-1]
for c in u:
if c == '(':
answer += ')'
elif c == ')':
answer += '('
return answer
문제를 이해하고 그대로 구현하는 문제기 때문에 큰틀에서는 결국 나랑 같은 방법이다. 하지만 확실히 변수를 줄이고 단순화 한 코드가 훨씬 깔끔해보이고 좋은 코드였다.
처음에 str인 answer문자열에 append함수를 사용해서 문자열을 추가해가는 방식으로 했었는데 여기서 문법에러가났다!!!
이유를 찾아보니 immutable과 mutable의 차이를 알 수 있었다.
immutable한 변수나 값들은 바꾸는게 아니라 할당을 바꾸는 즉 바인딩을 바꾸면서(주소를 바꾸면서) 바뀌어야하고 mutable한 변수는 그안의 값을 직접 바꾸기 때문에(주소를 안 바꾸기 때문에) append함수를 사용할 수 있었다.