여름의 서재

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

알고리즘/프로그래머스

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

엉아_ 2021. 11. 7. 03:15
728x90

📕 문제

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

 

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

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

programmers.co.kr

 

💡 풀이법

1. 올바른 괄호 문자열을 판별하는 balanced 함수를 따로 만들어 주었다.

2. 결과를 담을 answer 변수를 전역 변수로 만들어 주었다.

3. p가 빈값이거나 올바른 괄호 문자열이라면 answer에 p를 더해준다.

4. 그 외의 경우에는 문자열을 u, v로 나누어줘야한다.

(for문으로 문자열을 처음부터 돌면서 여는 괄호와 닫는 괄호의 개수가 같아지면 for 문을 멈춘다.

멈춘 index까지 u가 되고, 뒷부분은 v가 된다.)

6. u가 올바른 괄호 문자열이라면 answer에 u를 더하고 v에 대해 다시 solution함수를 실행시킨다.

7. u가 올바른 괄호 문자열이 아니라면, answer에 '('을 더해주고, v에 대해 다시 solution함수 실행시킨 후 answer에 ')'를 더한다. u의 양쪽을 제외하고 for문을 돌면서 '('이면 answer에 ')'를 더하고, ')'이면 '('를 더한다.

 

def balanced(p):
    new = []
    for i in p:
        if i == '(':
            new.append('(')
        else:
            if not new:
                return False
            else:
                new.pop()
    if new:
        return False
    else:
        return True

answer = ''
def solution(p):
    global answer
    if not p or balanced(p):
        answer += p
    else:
        open_cnt = close_cnt = 0
        i = 0
        for i in range(len(p)):
            if p[i] == '(':
                open_cnt += 1
            else:
                close_cnt += 1
            if open_cnt == close_cnt:
                break
        u, v = p[:i+1], p[i+1:]

        if balanced(u):
            answer += u
            solution(v)
        else:
            answer += '('
            solution(v)
            answer += ')'
            for i in u[1:len(u)-1]:
                if i == '(':
                    answer += ')'
                else:
                    answer += '('
    return answer
Comments