코딩테스트 연습 - 괄호 변환 | 프로그래머스 (programmers.co.kr)
시뮬레이션, 재귀 문제
문제에 괄호를 변환하는 규칙이 차례대로 명시돼 있으므로, 차근차근 따라서 구현하면 된다.
오늘의 포인트
- 함수 중복 막기
- 괄호 뒤집는 기능을 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 |