def solution(p):
# 1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
if not p :
return p
# 2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다.
check = True
num = 0
for i in range(len(p)) :
num += 1 if p[i] == '(' else -1
if num < 0 :
check = False
if num == 0 :
num = i+1
break
u, v = p[:num], p[num:]
# 3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
if check :
return u + solution(v)
# 4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
# 4-1, 4-2, 4-3
sol = solution(v)
answer = '()' if not sol else '(' + sol + ')'
# 4-4, 4-5
for letter in u[1:len(u)-1] :
answer += '(' if letter == ')' else ')'
return answer
풀이는 문제에서 요구한 방법 그대로 사용했다.
- 빈 문자열이면 끝
- w를 균형잡힌 괄호 문자열로 분리하기
2-1. 문자를 하나씩 비교하는데, 이때 '('는 +1, ')'는 -1을 더한다.
2-2. 0이 될 경우 앞부분을 u, 뒷부분을 v로 나눌 수 있다.
2-3. 이때 값이 0보다 작게 나온 적이 있다면 u는 "올바른 괄호 문자열"이 아니다.- "올바른 괄호 문자열"일 경우 u는 그대로 두고 v를 다시 1번부터 실행하고, 그 값을 출력한다.
- "올바른 괄호 문자열"이 아닐 경우 v를 다시 1번부터 실행한다.
4-1. v를 다시 실행한 값이 빈칸일 경우 answer에 '()' 를 넣어주고, 아닐 경우 값 양 옆에 괄호를 붙인다.
4-2. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙인다.
위 방법대로 문제를 풀 수 있었다.