https://school.programmers.co.kr/learn/courses/30/lessons/60058
문제를 이해하기가 너무나 어려웠다.
u,v를 나눈것 까진 이해가 됐지만 그 이후 v를 u에 붙여라... u를 v에 붙여라... 등등
공책에 끄적이며 예제를 풀어봐도 도저히 모르겠어서 문제 이해부분만 검색해 보았다.
def solution(p):
def right(s):
l = 0
r = 0
for i in s:
if i == '(':
l += 1
else:
r += 1
if l < r:
return False
return True
def devide_uv(s):
l = 0
r = 0
num = 0
for i in range(len(s)):
if s[i] == '(':
l += 1
elif s[i] == ')':
r += 1
if l == r:
num = i
break
u = s[:num+1]
v = s[num+1:]
return u,v
answer = ''
if p =='':
return p
if right(p):
return p
u,v = devide_uv(p)
if right(u):
return u + solution(v)
else:
answer += '('
answer += solution(v)
answer += ')'
a = u[1:-1]
for i in a:
if i == ')':
answer += '('
else:
answer += ')'
return answer
문제를 이해한 이후엔 간단했다.
우선 처음 p 문자열을 받고 p가 빈 문자열인지 확인 => 빈 문자열이라면 '' 리턴,
p가 올바른 문자열이라면 return p
아니라면, p를 u,v로 나누고 u가 올바른 문자열이라면 다시 v를 u1,v1으로 나눈다.
이 u1,v1에 대해 u1이 올바른 문자열이라면 v1에 대해 다시 u2,v2로 나눈다.
....u의 n, v의 n까지 재귀반복 후 둘 다 올바른 문자열이라면 이것을 u랑 이어붙인다.
만일 u1이 올바르지 않은 문자열이라면
빈 문자열 ''에 대해
( + v + ) + reverse(u)를 하면 된다.
정리하자면 u와 v를 나누는 부분과 올바른 문자열인지를 판별하는 함수를 만든 이후
solution함수를 계속 재귀호출하며 리턴해주면 된다.
문제 설명이 어어어어어엄~~청 불친절한 문제였다.
'알고리즘' 카테고리의 다른 글
프로그래머스)시저 암호-python (0) | 2023.02.13 |
---|---|
백준 2750)수 정렬하기 (0) | 2023.02.12 |
프로그래머스)콜라츠 추측 (0) | 2023.02.10 |
프로그래머스)제일 작은 수 제거하기 (0) | 2023.02.10 |
*프로그래머스) 삼각 달팽이-python (0) | 2023.02.10 |