https://school.programmers.co.kr/learn/courses/30/lessons/60058
# 221119
def finduv(p):
for i in range(len(p)):
if p[:i+1].count('(') == p[:i+1].count(')'):
return p[:i+1], p[i+1:]
return '', ''
def isRight(u):
if u[0] == ')':
return False
cnt = 0
for x in u:
if x == '(':
cnt += 1
elif x == ')':
cnt -= 1
return True if cnt == 0 else False
def change(u):
res = ''
for x in u[1:-1]:
res += ')' if x == '(' else '('
return res
def solution(p):
if p == '':
return ''
u, v = finduv(p)
if isRight(u):
return u + solution(v)
else:
return '(' + solution(v) + ')' + change(u)
return ''
# 예전 풀이
def solution(p):
answer = ''
if p == '':
return ''
if chk(p):
return p
u, v = chk_uv(p)
if chk(u) == True:
answer = u + solution(v)
else:
answer = '('+ solution(v) + ')' + change(u)
return answer
def chk_uv(p):
cnt = 0
u = ''
v = p
for i in p:
if i == '(':
cnt = cnt + 1
elif i == ')':
cnt = cnt - 1
u += i
v = v[1:]
if cnt == 0:
print(u, v)
return u, v
def change(u):
ans = ''
for x in u[1:-1]:
if x == '(':
ans += ')'
elif x == ')':
ans += '('
return ans
def chk(p): #올바른 문자열 체크
cnt = 0
for i in p:
if i == '(':
cnt = cnt + 1
elif i == ')':
cnt = cnt - 1
if cnt < 0:
return False
return True