728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/60058
[문제 풀이]
문제에서 주어진 알고리즘대로 진행하면 된다.
1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.
3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.
4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
4-3. ')'를 다시 붙입니다.
4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
4-5. 생성된 문자열을 반환합니다.
1번부터 보면 빈 문자열은 빈 문자열 반환하면 된다. p가 빈 문자열이면 그대로 return한다.
2번은 u와 v로 분리해야 한다. u와 v로 분리하기위해 sep(p) 함수를 만들었다. '(' 괄호와 ')' 괄호의 수가 같을 때, 그 지점까지를 u에 넣고 그 뒤에 부분을 v에 넣는다.
3번은 u가 '올바른 괄호 문자열'인지 확인해야 한다. 이를 위해 check(p) 함수를 만들었다. 올바른 괄호 문자열이면 True, 아니면 False를 반환하도록 하였다.
4번은 재귀적으로 해결하면 된다. 4-4 부분이 해석하기가 어려웠다. 먼저 u를 u[1:-1]로 저장하여 첫번째와 마지막 원소를 떼어낸다. 그리고 괄호방향을 뒤집기 위해 reverse함수를 만들어서 '(' 모양은 ')' 모양으로 ')'모양은 '('모양으로 바꾸어주었다.
def solution(p):
answer = ''
if p == '':
return p
if check(p):
return p
u=sep(p)[0]
v=sep(p)[1]
if check(u):
return u+solution(v)
else:
answer+='('
answer+=solution(v)
answer+=')'
u=u[1:-1]
for i in reverse(u):
answer+=i
return answer
def check(p):
x = y = 0
for i in range(len(p)):
if p[i] == '(':
x += 1
elif p[i] == ')':
y += 1
if x < y:
return False
return True
def sep(p):
x = y = 0
num = 0
u = ''
v = ''
while True:
if p[num] == '(':
x += 1
elif p[num] == ')':
y += 1
num += 1
if x == y:
for i in range(num):
u += p[i]
for j in range(num, len(p)):
v += p[j]
break
return u,v
def reverse(strings):
r = {"(":")", ")": "("}
return [r[s] for s in strings]
728x90
반응형
'알고리즘 > 알고리즘 문제' 카테고리의 다른 글
[파이썬] [1935 - 후위 표기식2] (0) | 2022.01.05 |
---|---|
1158 백준 요세푸스 문제 (파이썬) (0) | 2022.01.02 |
[파이썬] [백준 18405 경쟁적 전염] (0) | 2021.08.26 |
[파이썬] [백준 알고리즘 18352] 특정 거리의 도시 찾기 (0) | 2021.08.23 |
[파이썬] 백준 2178번 (DFS/BFS) 미로 탐색 (0) | 2021.08.23 |