def solution(p):
# 1
if p == '':
return p
# 2
u, v = divide(p)
# 3
if check(u):
return u + solution(v)
# 4
else:
temp = '('+solution(v)+')'
for x in u[1:-1]:
if x == '(':
temp += ')'
else:
temp += '('
return temp
def divide(p):
left, right = 0, 0
for k in range(len(p)):
if p[k] == '(':
left += 1
else:
right += 1
if left == right:
return p[:k+1], p[k+1:]
def check(u):
q = []
for x in u:
if not q:
q.append(x)
else:
if x == ')' and q[-1] == '(':
q.pop()
else:
q.append(x)
if q:
return False
return True
2020 카카오 블라인드
1. 빈 문자열이면 리턴
2. divide : 왼쪽 괄호와 오른쪽 괄호의 수가 같아지는 지점으로 슬라이싱해서 반환 (u = 최초의 '균형 잡힌 괄호', v = 나머지)
3. check (스택을 이용해서 '올바른 괄호 문자열' 인지 아닌지 boolean값 반환)가 True라면
- v를 가지고 다시 재귀적으로 판단
- u와 위 결괏값을 합해서 반환
4. check가 False라면 (u가 올바른 괄호 문자열이 아니라면)
- ( + v를 재귀로 돌린 반환 값 + ) 에서
- u의 앞뒤 값을 제외한 값을 반전해서 더해주기
- 결괏값 반환
문제를 읽다가 이해하 안 되는 부분이 있어서 잠깐 막혔었다. v를 재귀적 처리하라는 부분이었다.
풀다가 어디선가 오류가 나와서 결국 VSCode로 옮겨서 디버깅하고 정답처리가 됐다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2 - 수식 최대화 (파이썬) (1) | 2022.04.02 |
---|---|
[프로그래머스] Lv2 - 거리두기 확인하기 (파이썬) (0) | 2022.04.01 |
[프로그래머스] Lv2 - 메뉴 리뉴얼 (파이썬) (0) | 2022.03.31 |
[프로그래머스] Lv2 - 행렬 테두리 회전하기 (파이썬) (0) | 2022.03.31 |
[프로그래머스] Lv2 - 짝지어 제거하기 (파이썬) (0) | 2022.03.30 |