바위타는 두루미
8.9 괄호 본문
728x90
문제
n-쌍의 괄호로 만들 수 있는 모든 합당한(괄호가 열리고 닫힌) 조합을 출력하는 알고리즘을 구현하여라
입력 :3
출력 : ((())), (()()), (())(),()(()),()()()
접근법
첫번째는 f(n-1)의 결과로 f(n)을 만드는 재귀적인 방법을 통해 결과쌍을 찾을 수 있을 것이다.
n = 2인경우 (()), ()() 두가지가 있다.
n = 3인경우 (()()) ((())) (()(()) (())() ()()() 5가지가 있다.
그러면
(())=> (()()) - 첫번째 괄호 다음에 새로운 괄호 넣기
((())) - 두번째 괄호 다음에 새로운 괄호 넣기
()(()) - 가장 시작점에 넣는다.
()() => (())() - 첫번째 괄호 다음에 새로운 괄호 넣기
()(()) - 두번째 괄호 다음에 새로운 괄호 넣기
()()() - 가장 시작점에 넣는다.
이렇게 보면 중간에 ()(()) 가 중복된다. 이 중복되는 것을 방지하기위해 hash테이블이 필요하기도 하고 중복 처리에 시간이 소요되기 때문이다.
문자열 중복 문제를 해결하기 위해서는 처음부터 문자열을 만들어가는 방식을 사용하면 쉽게 해결이 가능하다.
왼쪽 괄호: 왼쪽 괄호를 다 소진하지 않는 이상 왼쪽 괄호는 항상 삽입한다.
오른쪽 괄호 : 문법 오류가 발생하지 않을떄만 넣을 수 있다. (오른쪽 괄호갯수가 왼쪽괄호갯수보다 큰경우가 오류)
그러면 괄호수만 추적하면 된다!
def addParen(left_r, right_r, char_list,result):
if left_r < 0 || right_r < left_r :
return
elif left_r == 0 || right_r ==0 :
result.append(''.join(char_list))
else :
char_list.append('(')
addParen(left_r-1, right_r , char_list, result)
char_list[-1] = ')'
addParen(left_r, right_r -1, char_list, result)
def Solution(n):
char_list= []
result = []
addParen(n,n,char_list, result)
return result
'Study > Interview준비' 카테고리의 다른 글
8.11 코인 (0) | 2019.08.05 |
---|---|
8.10 영역 칠하기 (0) | 2019.08.05 |
8.8 중복있는 순열 (0) | 2019.08.05 |
8.7 중복없는 순열 (0) | 2019.08.04 |
8.6 하노이타워 (0) | 2019.08.04 |
Comments