Algorithm/Simulation

[프로그래머스 Programmers] 괄호 변환 (Python)

잘될거야아마두 2021. 3. 26. 00:17

코딩테스트 연습 - 괄호 변환 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

시뮬레이션, 재귀 문제

문제에 괄호를 변환하는 규칙이 차례대로 명시돼 있으므로, 차근차근 따라서 구현하면 된다.

 

오늘의 포인트

  1. 함수 중복 막기
  2. 괄호 뒤집는 기능을 map으로 구현

1.

처음에는 그대로 따라서 순서대로 구현했는데, 균형잡힌 괄호 u, v를 분리하는 함수올바른 괄호인지 검사하는 함수의 내용이 거의 비슷한 것을 발견했다.

 

def balanced(w):
    flag = 0
    for i in range(len(w)):
        if w[i] == '(':
            flag += 1
        else:
            flag -= 1

        if flag == 0:
            return w[: i + 1], w[i + 1:]


def is_right(u):
    flag = 0
    for i in range(len(u)):
        if u[i] == '(':
            flag += 1
        else:
            flag -= 1

        if flag < 0:
            return False
    return True

return하는 값이 달라서 어떻게 합칠지 고민하다가 아래와 같이 구현했다.

balance = 0
flag = True
for i in range(len(w)):
    # 2 + 3
    if w[i] == '(':
    	balance += 1
    else:
    	balance -= 1

    # 올바른 괄호인가?
    # (균형잡힌 괄호 찾기 전에 확인할 수 있음)
    if balance < 0:
    	flag = False

    # 균형잡힌 괄호 찾으면
    # u의 균형 여부에 따라 진행
    if balance == 0:
    	u, v = w[: i + 1] + w[i + 1:]
        if flag:
            return u + solution(v)
        else:
            return ans + '(' + solution(v) + ')' + flip(u)

변수를 balance, flag 두 개로 분리했다. 그리고 반복문을 수행하면서 우선 u가 올바른 괄호인지 검사한다. 균형잡힌 문자열을 완성하기 전에 확인할 수 있기 때문이다.

 

 

2.

u의 괄호 방향을 뒤집는 함수는 map으로 간단하게 구현할 수 있다.

def flip(u):
    flipped = map(lambda x: '(' if x == ')' else ')', u[1: -1])
    return ''.join(flipped)

map은 함수와 iterable 객체를 파라미터로 받는다. 그리고 iterable의 각 원소에 대해 함수를 수행하고 난 결과를 map 객체로 반환한다. 반환된 객체는 말 그대로 map 객체이므로 join으로 문자열 형태로 만들어준다.

 

 

전체 코드

def flip(u):
    flipped = map(lambda x: '(' if x == ')' else ')', u[1: -1])
    return ''.join(flipped)


def solution(string):
    ans = ''

    # 1
    if not string:
        return ''

    w = string
    balance = 0
    flag = True
    for i in range(len(w)):
        # 2 + 3
        if w[i] == '(':
            balance += 1
        else:
            balance -= 1

        # 올바른 괄호인가?
        # (균형잡힌 괄호 찾기 전에 확인할 수 있음)
        if balance < 0:
            flag = False

        # 균형잡힌 괄호 찾으면
        # u의 균형 여부에 따라 진행
        if balance == 0:
            u, v = w[: i + 1], w[i + 1:]
            if flag:
                return u + solution(v)
            else:
                return ans + '(' + solution(v) + ')' + flip(u)

'Algorithm > Simulation' 카테고리의 다른 글

[백준 BOJ] 17281번 ⚾ (Python)  (0) 2021.03.19
[프로그래머스] 셔틀버스 (Python)  (0) 2020.11.11