코테연습문제
[Programmers/Python] 괄호 변환
SI-AH
2023. 4. 24. 12:03
def isBal(p):
stack = []
for letter in p:
if letter == '(':
stack.append(letter)
else:
if len(stack) == 0:
return False
else:
stack.pop()
if len(stack) == 0:
return True
else:
return False
#2
def setUV(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]
if i+1 > len(p):
v = ''
else:
v = p[i+1:]
break
return u, v
def rules(p):
result = ''
#1
if len(p) == 0:
return ''
#2
u, v = setUV(p)
#3
if isBal(u) == True:
result += u + rules(v)
#4
else:
bracket = '(' #4-1
bracket += rules(v) + ')' #4-2,3
u = u[1:-1]
#4-4
for nu in u:
if nu == '(':
bracket += ')'
else:
bracket += '('
result += bracket
#4-5
return result
def solution(p):
answer = ''
if isBal(p) == True:
return p
answer = rules(p)
return answer
풀이과정
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. 생성된 문자열을 반환합니다.
0. 문제에서 주어진 과정을 그대로 구현하면 된다. (코드에 주석으로 해당 구현 표시함)
a. rules라는 주어진 과정을 구현하는 함수를 새로 만든다.
b. setUV라는 u,v를 분리하는 함수를 새로 만든다.
b-1. '('와 ')'의 개수를 각각 구해서, 개수가 같아지면 '균형잡힌 괄호 문자열'이므로 u, v로 나눈다.
→ index에러가 생기지 않게 주의하기
c. isBal라는 '균형잡힌 괄호 문자열'을 판별하는 함수를 새로 만든다.
c-1. u가 '균형잡힌 괄호 문자열'이라면, result에 u를 이어 붙이고, v는 재귀적으로 rules함수를 수행한다.
c-2. u가 '균형잡힌 괄호 문자열'이 아니라면,
빈문자열 'bracket' 에 '('를 첫 번째 문자로 하고, v를 rules함수를 수행한 값과 ')'를 이어붙인다.
c-3. u의 양 끝 문자를 제거하고, 남은 문자열의 괄호의 방향을 뒤집어서 bracket에 이어 붙인다.
c-4. result에 bracket을 이어붙인 뒤 return한다.
d. solution함수에서 먼저 주어진 p가 '균형잡힌 괄호 문자열'인지 판별해, 맞다면 p를 그대로 return한다.
d-1. 아니라면, rules함수를 수행해 답을 구한다.