happenundo 2024. 2. 6. 17:17
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

DFS 문제 같이 생겼지만, DFS 문제는 아니고 재귀를 사용한 구현 문제다.

문제를 잘 이해하지 못해서, 풀지 못했다.

풀이를 보니 굉장히 쉽고, 문제만 이해한다면 구현할 수 있는 문제라는 생각이 들었다.

문제를 많이 풀어서 구현력을 키우자.

다시 풀어야 할 문제


풀이 코드

# 괄호 변환

# '균형 잡힌 괄호 문자열'의 인덱스 반환
def balanced_index(p):
    count = 0 # 왼쪽 괄호의 개수
    for i in range(len(p)):
        if p[i] == '(':
            count += 1
        else:
            count -= 1
        if count == 0:
            return i
        

# '올바른 괄호 문자열'인지 판단
def check_proper(p):
    count = 0 # 왼쪽 괄호의 개수
    for i in p:
        if i == '(':
            count += 1
        else:
            if count == 0: # 쌍이 맞지 않는 경우 False 반환
                return False
            count -= 1
    return True # 쌍이 맞는 경우에 True 반환


def solution(p):
    answer = ''
    if p == '':
        return answer
    index = balanced_index(p)
    u = p[:index + 1]
    v = p[index + 1:]

    # '올바른 괄호 문자열'이면, v에 대해 함수를 수행한 결과를 붙여 반환
    if check_proper(u):
        answer = u + solution(v)
    # '올바른 괄호 문자열'이 아니라면 아래의 과정을 수행
    else:
        answer = '('
        answer += solution(v)
        answer += ')'
        u = list(u[1:-1]) # 첫번째와 마지막 문자를 제거
        for i in range(len(u)):
            if u[i] == '(':
                u[i] = ')'
            else:
                u[i] = '('
        answer += "".join(u)
    return answer

 

728x90