📖 문제
🧑🏻💻 풀이 과정
1) 문제 이해 및 접근
주어진 문자열을 계속하여 분할하면서 재귀적 호출이 필요하여 함수를 만들어 접근하였습니다.
2) 알고리즘
- 재귀
- 구현
3) 풀이 코드
사용 언어 - Python
def solution(p):
# 올바른 괄호 문자열인지 판별
def is_right(s):
stack = [] # 괄호를 쌓아놓 리스트
for c in s:
if c == '(': # 현재 괄호가 여는 괄호라면
stack.append('(') # 리스트에 저장
elif not stack: # 닫는 괄호인데, 이전에 여는 괄호가 없었다면
return False # 올바른 괄호가 아님
elif stack[-1] == '(': # 현재 괄호가 닫는 괄호인데, 바로 이전 괄호가 여는 괄호였으면
stack.pop() # 여는 괄호 삭제
return True # 모든 괄호를 반복 완료시 올바른 괄호가 맞음
# 주어진 괄호를 두개의 부분으로 나누는 함수
def separate(s):
if not s: # 공백이라면
return s, s # 공백 반환 (출력값이 두개여야 하므로, 공백 두개 반환)
cnt = 0 # 균형잡힌 괄호를 반환하면 되므로, 개수가 서로 맞는지만 확인 필요
for idx in range(len(s)):
cnt += 1 if s[idx] == '(' else -1 # 현재 괄호가 여는 괄호면 +1, 닫는 괄호면 -1
if not cnt: # 균형잡힌 괄호가 맞다면, 반복 종료
break
return s[:idx+1], s[idx+1:] # 반복이 멈춘 인덱스를 기준으로 두개의 괄호로 나누어서 반환
# 주어진 조건으로 진행하는 함수, 재귀 호출
def solution(s):
if is_right(s): # 비어있는 문자열이라면, 바로 반환
return s
u, v = separate(s) # 두개의 괄호로 나눔
if is_right(u): # u가 올바른 괄호라면
return u + solution(v) # v를 재귀 호출하여 처음 과정 반복하고, 그 결과를 u 뒤에 붙여서 반환
else: # u가 올바른 괄호가 아니라면
reverse_bracket = [] # u의 괄호들을 뒤집어서 저장하는 리스트
for c in u[1:-1]: # u의 앞뒤를 삭제하고, 남아 있는 괄호들을 뒤집음
if c == '(':
reverse_bracket.append(')')
else:
reverse_bracket.append('(')
return '(' + solution(v) + ')' + ''.join(reverse_bracket) # 조건에 맞게 괄호들을 붙임
return solution(p)
📝 결과 및 학습한 내용
1) 어려웠던 내용
특별히 없습니다.
2) 새롭게 학습한 내용
특별히 없습니다.
🔗 문제 링크
- https://programmers.co.kr/learn/courses/30/lessons/60058
※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
[백준] 2644 촌수계산 (0) | 2022.03.13 |
---|---|
[백준] 1051 숫자 정사각형 (0) | 2022.03.11 |
[백준] 1774 우주신과의 교감 (0) | 2022.03.09 |
[백준] 12015 가장 긴 증가하는 부분 수열 2 (0) | 2022.03.08 |
[프로그래머스] 기둥과 보 설치 (0) | 2022.03.07 |
댓글