본문 바로가기

알고리즘/Programmers

[Programmers / Python] 괄호변환

문제이해

이건 국어문제 같습니다. 이해가 너무 어려웠어요

제귀로 푸는 문제라서 코드를 보면서 이해하는게 좋을거 같습니다.

 

코드

먼저 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