알고리즘 스터디 2021.07~

[프로그래머스] 2020 카카오 블라인드 - 괄호 변환

문제

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

 

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

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

programmers.co.kr

 


풀이

 

문제에서 요구하는 것을 잘 알아듣고 구현하는게 관건인 문제였다.

왜 저런 프로세스를 거치면 올바른 괄호 문자열이 되는 것인지 잘 이해가 안가서 예시를 써보며 이해했다.

어쨌거나 문제는 내가 직접 올바를 괄호 문자열을 만드는 로직을 짜는 것이 아니고 저 프로세스를 따라 구현하는 것이었어서 순서대로 함수를 작성했다.

def splitP(string):
    pair = 0
    for i, p in enumerate(string):
        if p == '(':
            pair += 1
        else:
            pair -= 1
        if pair == 0:
            return string[:i+1], string[i+1:]
    return string, ''
        
def isCorrect(string):
    pair = 0
    for i, p in enumerate(string):
        if p == '(':
            pair += 1
        else:
            pair -= 1
        if pair < 0:
            return False
    return True

def reverse(string):
    result = ''
    for s in string:
        if s == '(':
            result += ')'
        else:
            result += '('
    return result

def process(p):
    u, v = splitP(p)
    
    processedV = process(v) if v != '' else ''
    if isCorrect(u):
        return u + processedV
    else:
        return '(' + processedV + ')' + reverse(u[1:-1])

def solution(p):
    return process(p)

그냥 시키는대로 했더니 통과했다.

다만 splitP와 isCorrect 의 코드는 더 깔끔하게 합칠 수 있을 듯 싶다.

 


다른 사람의 풀이

 

def solution(p):
    if p=='': return p
    r=True; c=0
    for i in range(len(p)):
        if p[i]=='(': c-=1
        else: c+=1
        if c>0: r=False
        if c==0:
            if r:
                return p[:i+1]+solution(p[i+1:])
            else:
                return '('+solution(p[i+1:])+')'+''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) ))

u, v로 split 하기 위해 따로 반목문을 돌지 않고 p를 바로 잘라서 썼다.

또 4-4를 구현하기 위해 나는 reverse함수를 만들었는데 이분은 lambda와 map으로 짧게 푸셨다