


문제 출처 : 프로그래머스
난이도 : Level 2
이 문제를 처음 읽었을 때 가장 헷갈렸던 건
‘균형잡힌 괄호 문자열’과 ‘올바른 괄호 문자열’의 차이였다.
균형잡힌 괄호 문자열
올바른 괄호 문자열
이 문제는
👉 균형만 맞는 문자열을, 올바른 괄호 문자열로 변환하는 문제다.
이 문제는 아이디어를 새로 떠올리는 문제가 아니라
문제에서 제시한 알고리즘(1~4단계)을 그대로 구현하는 문제다.
전체 흐름은 다음과 같다.
문제에서 말하는
“u는 더 이상 분리할 수 없는 균형잡힌 괄호 문자열”의 의미는,
왼쪽부터 문자를 보면서
'('는 +1, ')'는 -1
처음으로 합이 0이 되는 지점까지가 u
라는 뜻이다.
그래서 balance가 처음 0이 되는 순간 바로 끊어야 한다.
스택을 쓰지 않아도 된다.
왼쪽부터 보면서
을 했을 때,
중간에 한 번이라도 음수가 되면 올바르지 않은 괄호 문자열이다.
u가 올바르지 않은 경우 결과 문자열은 항상 아래 형태다.
"( solution(v) )" + 뒤집은(u의 내부)
여기서 순서를 헷갈리면 오답이 된다.
반드시 앞에 괄호로 감싼 문자열을 만들고, 그 뒤에 뒤집은 u를 붙인다.
def split_uv(w):
balance = 0
for i, c in enumerate(w):
if c == '(':
balance += 1
else:
balance -= 1
if balance == 0:
return w[:i+1], w[i+1:]
def solution(p):
if p == "":
return ""
u, v = split_uv(p)
# u가 올바른 괄호 문자열인지 확인
balance = 0
is_correct = True
for c in u:
balance += 1 if c == '(' else -1
if balance < 0:
is_correct = False
break
# 올바른 경우
if is_correct:
return u + solution(v)
# 올바르지 않은 경우
temp = "(" + solution(v) + ")"
reversed_u = ""
for c in u[1:-1]:
reversed_u += ")" if c == "(" else "("
return temp + reversed_u