문제
해결 과정
check함수
- 올바른 괄호 문자열인지 확인하는 함수
- 문자열에 대해 하나씩 확인하면서
- 열린 괄호라면 스택에 넣고
- 닫힌 괄호라면
스택이 비워져있다면 바로 false
반환 = 닫힌 괄호와 맞는 게 없는 것
가장 마지막에 넣은 게 열린 괄호일테니까 pop
으로 제거
divide함수
- 문자열을 u,v로 분리하는 함수, 균형잡힌 (열린 괄호, 닫힌 괄호 개수가 같게) 문자열로 분리
- 열린 괄호와 닫힌 괄호의 개수를 세는 변수 만들기
- 문자열을 하나씩 확인하면서
열린 괄호와 닫힌 괄호의 개수를 세다가
둘의 개수가 같아지면 문자열에 대해서 균형잡힌 문자열과 아닌 문자열을 반환
solution함수
1) 입력이 빈 문자열인 경우 빈문자열 반환
2) 문자열을 u
,v
로 분리
3) u
가 올바른 괄호 문자열이라면 v
를 다시 solution함수
수행
- 수행한 결과를
u
에 이어붙이기
4) u
가 올바른 괄호 문자열이 아니라면
- 빈 문자열
answer
에 '('를 붙이고
v
에 대해 다시 solution함수
수행헌 결과를 answer
에 이어붙이기
- 다시
answer
에 ')'를 붙이기
u
의 첫번째 문자와 마지막 문자를 제거하고, 그 문자열의 괄호를 반대로 뒤집어서 answer
에 붙이기
풀이
def check(c):
stack = []
for i in c:
if i == '(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True
def divide(p):
open_p = 0
close_p = 0
for i in range(len(p)):
if p[i] == '(':
open_p += 1
else:
close_p += 1
if open_p == close_p:
return p[:i+1], p[i+1:]
def solution(p):
if not p:
return ''
u,v = divide(p)
if check(u):
return u + solution(v)
else:
answer = '('
answer += solution(v)
answer += ')'
for i in u[1:len(u)-1]:
if i == '(':
answer += ')'
else:
answer += '('
return answer