https://programmers.co.kr/learn/courses/30/lessons/60058
def check(x):
stack = []
for i in x:
if i == '(':
stack.append(1)
else:
try:
stack.pop()
except:
return False
return True
def div(w):
for i in w:
leftcnt = 0
rightcnt = 0
for i in w:
if i == '(':
leftcnt += 1
elif i == ')':
rightcnt += 1
if leftcnt == rightcnt:
break
return w[0 : leftcnt+rightcnt], w[leftcnt+rightcnt : ]
def solution(p):
if not p:
return ''
u, v = div(p)
if check(u):
return u + solution(v)
else:
tmp = '('
tmp += solution(v)
tmp += ')'
for i in u[1:-1]:
if i == '(':
tmp += ')'
else:
tmp += '('
return tmp
코드를 짯는데 오답이나와서 검색해봤다..
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
문제의 의사코드를 똑같이 따라서 코드를 작성하는게 중요한데
글을 이해하기 어렵게 써놨다는 평이 많다
def solution(p):
def process(w):
print(w)
if w == '':
return ''
leftcnt = 0
rightcnt = 0
for i in w:
if i == '(':
leftcnt += 1
elif i == ')':
rightcnt += 1
if leftcnt == rightcnt:
break
u = w[0 : leftcnt+rightcnt]
v = w[leftcnt+rightcnt : ]
print(u,v)
if len(u) == 2:
return '()' + process(v)
else:
return '(' + process(u[1:-1]) + ')' + process(v)
return process(p)