문제이해
이건 국어문제 같습니다. 이해가 너무 어려웠어요
제귀로 푸는 문제라서 코드를 보면서 이해하는게 좋을거 같습니다.
코드
먼저 check 함수는 문자열을 받아서 그 문자열이 올바른 괄호 문자열인지 확인합니다.
def check(str):
li =[]
for i in str:
if(i == '('):
li.append(i)
else:
if(len(li) == 0):
return False
li.pop()
if(len(li) == 0):
return True
else:
return False
스택을 이용했습니다. '('는 넣고 ')'가 들어오면 스택(li)는 비게됩니다. 모두다 비면 True를 반환합니다.
def solution(p):
answer = ''
left = 0
right = 0
u = ""
v = ""
if(len(p) == 0):
return answer
for value in range(len(p)+1):
if(p[value] =='('):
left += 1
elif(p[value] == ')'):
right += 1
if(left != 0 and left == right):
u = p[0:value+1]
v = p[value+1:]
break
if(check(u)):
answer += u
answer += solution(v)
else:
answer += '('
answer += solution(v)
answer += ')'
print(u)
for q in range(1,len(u)-1): #))(( 첫 번째랑 마지막꺼 땜
if(p[q] == '('):
answer += ')'
if(p[q] == ')'):
answer += '('
return answer
주어진 문자열이 없다면 그냥 빈 문자열을 반환합니다.
균형잡힌 괄호로 분열을 시켜야 합니다. 만약 '('와 ')' 수가 같을 때, 문자열을 슬라이싱 하면 됩니다.
왼쪽은 u, 오른쪽은 v로 지정합니다.
그 다음 u가 올바른 괄호라면 u의 문자열과 v의 제귀값을 담습니다.
ex) u = "()" , v = "))((()" 이면 solution( "))((()" ) 가 됩니다. 그러면 또 u = "))((" , v = "()" 가 됩니다.
만약 u가 "))((" 상태가 되면 ( solution( "()" ) ) 를 정답으로 반환합니다. 이 때 u의 첫 번째와 마지막을 버리면 ")(" 남슴니다. 그걸 뒤집어서 정답 문자열에 넣어줍니다.
728x90
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers / Java] 멀쩡한 사각형 (0) | 2022.05.07 |
---|---|
[Programmers / Python] 메뉴 리뉴얼 (0) | 2022.03.04 |
[Programmers / Python] 순위검색 (0) | 2022.03.02 |
[Programmers / Python] 비밀지도 (0) | 2022.02.26 |
[Programmers / Java] 로또의 최고 순위와 최저 순위 (0) | 2021.12.17 |