본문 바로가기
Problem Solving/카카오 코딩테스트

[프로그래머스 programmers] 괄호 변환

by ggyongi 2021. 4. 29.
반응형

programmers.co.kr/learn/courses/30/lessons/60058

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

def solution(p):
    def isOrdered(string):
        stack = []
        for i in range(len(string)):
            if string[i] == ")":
                if not stack:
                    return False
                stack.pop()    
            else:
                stack.append(string[i])
        if not stack:
            return True  ## p has aleady right order.
        else:
            return False
        
    def divide(string):
        opens = 0
        closes = 0
        for i in range(len(string)):
            if string[i]=='(':
                opens +=1
            else:
                closes +=1
            if opens == closes:  ## balanced
                return i    
    
    def rvs(string):
        result = ''
        for i in range(len(string)):
            if string[i] == '(':
                result += ')'
            else:
                result += '('
        return result
        
    def transfer(string):
        if not string:
            return ''
        i = divide(string)
        left, right = string[:i+1], string[i+1:]

        if isOrdered(left):
            return left + transfer(right)
        else:
            return '(' + transfer(right) + ')' + rvs(left[1:-1])
    
    return transfer(p)

 

리스트컴프리헨션을 이용해 rvs 함수를 간단히 하였다.

if else가 섞인 리스트컴프리헨션의 순서는 [() if (조건) else () for () in ()]이다.

 

def solution(p):
    def isOrdered(string):
        stack = []
        for i in range(len(string)):
            if string[i] == ")":
                if not stack:
                    return False
                stack.pop()    
            else:
                stack.append(string[i])
        if not stack:
            return True  ## p has aleady right order.
        else:
            return False
        
    def divide(string):
        n = 0
        for i in range(len(string)):
            if string[i]=='(': 
                n +=1
            else: 
                n -=1
            if n == 0 :  ## balanced
                return i    
    
    def rvs(string):
        return ''.join([')' if string[i]=='(' else '(' for i in range(len(string))])
        
    def transfer(string):
        if not string:
            return ''
        i = divide(string)
        left, right = string[:i+1], string[i+1:]

        if isOrdered(left):
            return left + transfer(right)
        else:
            return '(' + transfer(right) + ')' + rvs(left[1:-1])
    
    return transfer(p)
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글