본문 바로가기

알고리즘

프로그래머스)괄호 변환-pyhton

https://school.programmers.co.kr/learn/courses/30/lessons/60058

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제를 이해하기가 너무나 어려웠다.

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함수를 계속 재귀호출하며 리턴해주면 된다.

문제 설명이 어어어어어엄~~청 불친절한 문제였다.