본문 바로가기

Problems/Programmers

괄호 변환

문제 링크 : programmers.co.kr/learn/courses/30/lessons/60058?language=python3

 

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

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

programmers.co.kr

문제에서 문자열을 변환하는 방법에 대해 상세하게 설명하고 있으므로

착실하게 구현하면 해결할 수 있습니다.

 

문자열이 "올바른 문자열"이 아니라면 재귀적으로 변환하는 구조이므로

재귀 함수를 사용하여 구현했습니다.(recurvise 함수)

 

문자열 p가 "균형잡힌 문자열"로 주어지므로 일일이 문자열의 마지막까지 괄호의 수를 확인해줄 필요는 없습니다.

def divide(w:str) -> tuple:  # 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.
    cntOpen, cntClose = 0, 0
    for i in range(len(w)):
        ch = w[i]
        if ch == '(':
            cntOpen += 1
        else:
            cntClose += 1
        if cntOpen == cntClose:
            return (w[:i+1], w[i+1:])

def isProperString(s:str) -> bool:  # "균형잡힌 문자열"인 s가 "올바른 문자열"인지 확인
    cntOpen, cntClose = 0, 0
    for ch in s:
        if ch == '(':
            cntOpen += 1
        else:
            cntClose += 1
        if cntClose > cntOpen:
            return False
    return True

def convertBrackets(s:str) -> str:  # u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.
    temp = ''
    for i in range(1, len(s)-1):
        if s[i] == '(':
            temp += ')'
        else:
            temp += '('
    return temp

def recursive(s:str) -> str:
    if s == '': # 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
        return ''
    u, v = divide(s)
    if isProperString(u):   # 3단계
        return u + recursive(v)
    else:   # 4단계
        return '(' + recursive(v) + ')' + convertBrackets(u)

def solution(p):
    answer = recursive(p)
    return answer

'Problems > Programmers' 카테고리의 다른 글

보석 쇼핑 (카카오 인턴 2020 기출)  (0) 2021.10.02
길 찾기 게임  (0) 2021.04.30
오픈채팅방  (0) 2021.04.30
외벽 점검  (0) 2021.04.23
가사 검색  (0) 2021.04.23