이코테에서는 dfs/bfs라고 소개된 문제였는데 그다지 별 상관은 없어보였다. 헷갈리지 않고 구현하는게 핵심이었다. 푸는덴 한 30분 조금 더 걸린 듯..
#p346
def solution(p):
if p == '':
return p
def equil(p): #균형 문자열
left = 0
right = 0
for i in p:
if i == ')':
right += 1
else:
left += 1
if left == right:
return True
return False
def correct(p): #올바른 문자열
stack = []
for i in p:
if i == '(':
stack.append(i)
else:
if len(stack) == 0:
return False
else:
stack.pop(-1)
return True
u = ''
v = ''
for i in range(1, len(p)+1): #u, v로 분리
if equil(p[:i]):
u = p[:i]
v = p[i:]
break
#u가 올바른 문자열일 경우
if correct(u):
v = solution(v)
answer = u + v
return answer
#u가 올바른 문자열이 아닐 경우
else:
answer = ''
answer += '('
answer += solution(v)
answer += ')'
u_temp = ''
for i in u[1:-1]:
if i == '(':
u_temp += ')'
else:
u_temp += '('
answer += u_temp
return answer
solution("()))((()")
그런데 다른 사람의 풀이를 봐보니 u가 문자열이 아닌 경우에 괄호를 변환하는 부분이나 올바른/균형 문자열을 어이가 없을 정도로 간결하게 작성한 것도 있었다. 아직 난 한참 부족한 것 같다. 아직 문제를 제대로 추상화시키지 못하고 있는 듯하다.