'(' 와 ')' 로만 이루어진 문자열이 있을 경우, "균형잡힌 괄호 문자열" p가 매개변수로 주어질 때, 주어진 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 반환하는 함수 작성
'(' 와 ')' 로만 이루어진 문자열이 있을 경우, '(' 의 개수와 ')' 의 개수가 같다면 이를 균형잡힌 괄호 문자열이라고 부릅니다.
그리고 여기에 '('와 ')'의 괄호의 짝도 모두 맞을 경우에는 이를 올바른 괄호 문자열이라고 부릅니다.
예를 들어, "(()))("
와 같은 문자열은 "균형잡힌 괄호 문자열" 이지만 "올바른 괄호 문자열"은 아닙니다.
반면에 "(())()"
와 같은 문자열은 "균형잡힌 괄호 문자열" 이면서 동시에 "올바른 괄호 문자열" 입니다.
'(' 와 ')' 로만 이루어진 문자열 w가 "균형잡힌 괄호 문자열" 이라면 다음과 같은 과정을 통해 "올바른 괄호 문자열"로 변환할 수 있습니다.
- 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
- 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
- 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.- 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
def solution(p):
if p == '':
return ''
cnt = 0
chk = True
for idx, item in enumerate(p):
if item == "(":
cnt += 1
else:
cnt -= 1
if cnt < 0:
chk = False
if cnt == 0:
if chk:
return p[:idx+1] + solution(p[idx+1:])
else:
tmp = "("
tmp += solution(p[idx+1:])
tmp += ")"
for c in p[1:idx]:
if c == "(":
tmp += ")"
else:
tmp += "("
return tmp
u
는 더 이상 분리할 수 없는 균형잡힌 괄호 문자열이므로, 괄호가 열렸을 때 증가시키고 닫을 때 감소시키는 cnt
변수와, cnt
가 단 한번이라도 음수가 된 적이 있는지 (닫는 괄호가 먼저 나온 적이 있는 지) 를 판단하기 위한 boolean
변수 chk
의 초기값 True
설정p
를 순회하는 for
Loop으로 인덱스와 개별 괄호 문자열 추출cnt
를 1 증가시키고, 닫는 괄호 문자열이 나올경우 1을 감소시킴for
Loop 순회 도중 cnt
값이 음수일 경우 chk
변수를 False
로 변환하여 cnt
가 0이 되었을 때 '올바르지 않은 괄호 문자열' 의 변환 과정을 수행할 수 있도록 함for
Loop 순회 도중 cnt
값이 0이고 chk
가 True
일 경우 '올바른 괄호 문자열' 이므로, 해당 인덱스까지를 포함하는 문자열 p[:idx+1]
를 뗀 나머지 p[idx+1:]
에 대하여 solution()
함수를 재귀적으로 적용함def sep_uv(w):
op_cnt = 0
cl_cnt = 0
for i, item in enumerate(w):
if item == "(":
op_cnt += 1
else:
cl_cnt += 1
if op_cnt == cl_cnt:
return w[:i+1], w[i+1:]
def is_balanced(u):
stack = []
for item in u:
if item == "(":
stack.append(item)
else:
if not stack:
return False
stack.pop()
return True if not stack else False
def solution(p):
#1
if p == '': return ''
#2
u, v = sep_uv(p)
#3 ~ 3-1
if is_balanced(u):
return u + solution(v)
#4
else:
answer = "(" #4-1
answer += solution(v) #4-2
answer += ")" #4-3
#4-4
for item in u[1:-1]:
if item == "(":
answer += ")"
else:
answer += "("
return answer #4-5