생각과 고민이 담긴 코드

프로그래머스 - 괄호 변환 (2020 KAKAO 블라인드 채용) / Level 2 본문

Algorithm/프로그래머스

프로그래머스 - 괄호 변환 (2020 KAKAO 블라인드 채용) / Level 2

0_Hun 2021. 11. 10. 18:42

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

 

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

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

programmers.co.kr

 

풀이


def solution(p):
    
    if p == "":
        return ""
    
    if verify(p):  # 올바른 괄호 문자열이면 그대로 return.
        return p
    
    p = list(p)
    u = [p.pop(0)]
    cnt = 1
    
    while cnt != 0:  # 균형잡힌 괄호 문자열을 p로부터 분리.
        item = p.pop(0)
        
        if item == u[0]:
            u.append(item)
            cnt += 1
        else:
            u.append(item)
            cnt -= 1
    
    if verify(u):  # u가 올바른 괄호 문자열일 경우.
        return "".join(u) + solution("".join(p))
    else:  # u가 올바른 괄호 문자열이 아닌 경우.
        u.pop(0)
        u.pop()
        
        for i in range(len(u)):
            if u[i] == '(':
                u[i] = ')'
            else:
                u[i] = '('
        return '(' + solution("".join(p)) + ')' + "".join(u)
        
def verify(s):  # 올바른 괄호 문자열인지 판단.
    stack = []
    
    for i in s:
        if i == '(':
            stack.append(i)
        else:
            if stack:
                stack.pop(0)
            else:
                return False
    return True

문제를 해석하는데 좀 애먹었던 문제였다.

그러나 풀이는 이해한 설명을 그대로 코드로 옮기면 되는 구현 문제에 가까웠다.

 

다만 올바른 괄호인지 검사할 때 stack를 활용하여 쉽게 검사하는 것과

재귀 호출에 대한 기본적인 이해는 필요했다.