프로그래밍/Algorithm

프로그래머스 괄호변환 파이썬

모지사바하 2022. 1. 12. 11:19

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

 

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

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

programmers.co.kr

 

이 문제는 문제의 조건이 너무 상세하게 나와서 그냥 문제 조건에 나온 내용을 코드로 그대로 옮겼더니 풀렸다.

별로 어려울건 없었는데 문제 설명 중, 균형잡힌괄호문자열의 의미를 잠깐 잘못 이해했다.

균형잡힌문자열은 열린괄호와 닫힌괄호의 수가 같은 것이다.

문제 조건 중 '단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며' 라는 부분이 있는데 이 부분에서

더이상 분리할 수 없으려면 무조건 두개로 자르면 되지 라고 생각했다가 아래 예시설명을 보고 곧 아님을 알았다.

 

균형잡힌 문자열이면서 더이상 분리할 수 없어야 한다.

 

나머지는 그냥 조건이 시키는대로 그대로 코드로 옮겼을 뿐이다.

 

다만 코드가 조금 길어질듯 하여 함수를 나눴다.

 

쉬움..

 

def separate_bracket(p):
    open_cnt = 0
    close_cnt = 0
    u = ''
    v = ''
    for i in range(len(p)):
        if p[i] == '(':
            open_cnt += 1
        else:
            close_cnt += 1

        if open_cnt == close_cnt:
            u = p[:i + 1]
            v = p[i + 1:]
            break

    return u, v


def is_perfect(p):
    temp = []
    if p[0] == ')':
        return False

    for c in p:
        if c == '(':
            temp.append(c)
        else:
            if temp:
                temp.pop()
            else:
                return False

    if temp:
        return False

    return True


def solution(p):
    answer = ''
    if p == '':
        return ''

    u, v = separate_bracket(p)
    if is_perfect(u):
        u += solution(v)
        return u
    else:
        temp = '('
        temp += solution(v)
        temp += ')'
        for i in range(1, len(u) - 1):
            if u[i] == ')':
                temp += '('
            else:
                temp += ')'
        return temp

    return answer