(프로그래머스 with python) 괄호변환
Level2 - 괄호변환
https://programmers.co.kr/learn/courses/30/lessons/60058
어려웠다.. 재귀를 이용해야 했지만 어떻게 활용해야 할지 감이 안왔다. 다른 풀이를 보고 이해는데 목표를 둔 문제였다.
# step1 u,v분리하기
def divUV(p):
left, right = 0, 0
for i in range(len(p)):
if p[i] == '(':
left += 1
else:
right += 1
if left == right:
u = p[:i+1]
v = p[i+1:] if i + 1 < len(p) else "" # v = p[i+1: ] 로만 하면 out of index 오류가 발생할 수 있다.
break
return u, v
# step2 올바른 괄호 문자열 판별하기
def isCorrect(p):
stack = []
for c in p:
if c == '(':
stack.append(c)
else:
if not len(stack):
return False
elif stack[-1] == '(':
stack.pop()
return False if len(stack) else True
def rec(p):
result = ''
if not len(p):
return ''
u, v = divUV(p)
if isCorrect(u):
result = u + rec(v)
else:
tmp = '('
tmp += rec(v)
tmp += ')'
u = u[1:-1]
for c in u:
if c == '(':
tmp += ')'
else:
tmp += '('
result += tmp
return result
def solution(p):
answer = ''
if isCorrect(p):
return p
answer = rec(p)
return answer
solution("()))((()")
위와 같이 지문 순서대로 함수를 만들어 풀 수도 있었지만 lambda함수를 이용해서 간단하게 풀 수 도 있었다(이걸..?)
def solution(p):
if p=='':
return p
r=True
c=0
for i in range(len(p)):
if p[i]=='(': c-=1
else: c+=1
if c>0: r=False
if c==0:
if r:
return p[:i+1]+solution(p[i+1:])
else:
return '('+solution(p[i+1:])+')'+''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) ))
solution("()))((()")