"균형잡힌 괄호 문자열" p가 매개변수로 주어질 때, 주어진 알고리즘을 수행해 "올바른 괄호 문자열"로 변환한 결과를 return 하도록 solution 함수를 완성해 주세요.
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. 생성된 문자열을 반환합니다.
설명이 길어 핵심과 헷갈렸던 부분만 짚어가며 시나리오를 써봤다.
(
와 )
의 개수만 동일하면 됨.(
와 )
의 개수만 동일하고 모든 괄호가 온전히 열고 닫힘.(
, )
의 개수를 각각 세어 동일해지면 분할(
이면 push)
인데, 스택의 맨 위를 확인(peek)해서 (
이면 pop# 변환 로직
def transform(p):
if not p: return p
u, v = dividing(p)
if correcting(u):
return u + transform(v)
s = "(" + transform(v) + ")"
for i in u[1:len(u)-1]:
if i == "(": s += ")"
else: s += "("
return s
# 균형 잡힌 두 개의 괄호 문자열로 분할
def dividing(s):
left, right = 0, 0
for i in range(len(s)):
if s[i] == '(': left += 1
else: right += 1
if left == right:
return s[:i+1], s[i+1:]
# 올바른 괄호 문자열인지 판단.
def correcting(s):
stack = [s[0]]
for i in s[1:]:
if not stack or i == "(": stack.append(i)
elif stack[-1] == ")": stack.append(i)
else: stack.pop()
if not stack: return True
else: return False
def solution(p):
return transform(p)
문제의 난이도가 높지 않음에도 문제 해석에 많은 시간을 소비한 것이 아쉬웠다. 문제를 제대로 이해하지 못해 질문하시는 분들이 몇몇 계셨다.문제가 복잡할 땐 시나리오나 슈더코드를 작성해보며 설계하는 습관을 들이도록 하자😛