본문 바로가기

운동하는 개발자/알고리즘, 코딩테스트

programmers [level2] 괄호변환 /알고리즘 프로그래머스 / 2020 카카오 블라인드 채용문제

728x90

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

난이도 : Level2

문제
- 카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다.
수정해야 할 소스 파일이 너무 많아서 고민하던 "콘"은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는 프로그램을 다음과 같이 개발하려고 합니다.


 

풀이 : 주어진 시나리오대로 구성 잘라서 확인하고 붙이고 자르고 남은거 재귀 함수돌리고 반복

 

답안

def swap(p):
    resultStr = ""
    for i in range(0, len(p)):   
        if p[i] == '(':
            resultStr += ')'
        else:
            resultStr += '('
    return resultStr

def right(p):
    nLCnt = 0
    nRCnt = 0     
    for i in range(0, len(p)):         
        if p[i] == '(':
            nLCnt += 1
        else:
            nRCnt += 1
        if nLCnt < nRCnt:
            return -1
    else:
        return 0
                


def solution(p):
    answer = ''
    if p == '':
        return answer
    
    nLCnt = 0
    nRCnt = 0   
    
    for i in range(0, len(p)):         
        if p[i] == '(':
            nLCnt += 1
        else:
            nRCnt += 1

        if nLCnt == nRCnt:
            u = p[:i+1]
            v = p[i+1:len(p)]
            
            if right(u) == 0:
                answer = answer+u
                answer = answer+solution(v)   
            else:
                temp = '(' + solution(v) + ')' 
                u = u[1:len(u)-1]
                answer = answer+temp+str(swap(u))    
            break            
        
    return answer


# print(solution('(()())()'))
# print(solution(')('))
print(solution('()))((()'))
# "(()())()"	"(()())()"
# ")("	"()"
# "()))((()"	"()(())()"

 

느낀점

더보기
처음에 풀다가 답답해서 vscode로 옮겨서 디버깅하며 푼문제
생각보다 쉽고 빠르게 풀었지만 디버깅이 어려운 이 프로그래머스에서만 풀었더라면 훨씬 더 걸렸을 것 같다
문제가 복잡해서 주어진 시나리오 그대로 쭈욱 수도코드 식으로 짜보며 진행했더니 별 어려움이 없었다

 

728x90