올바른 괄호란 (())나 ()와 같이 올바르게 모두 닫힌 괄호를 의미한다.
괄호 쌍의 개수 n이 주어질 때, n개의 괄호 쌍으로 만들 수 있는 모든 가능한 괄호 문자열의 갯수를 반환한다.
AB
로 2분할 했다고 가정한다.A
와 B
모두 올바르게 괄호가 형성되어있는 상태여야 한다.()AB / (A)B / (AB) / A(B) / AB()
형태가 될 수 있다.(A)B
형태로 모든 경우를 만들 수 있다.len(A) == 0
일 때, ( ) { 3 쌍의 괄호 } 형태가 된다.len(A) == 1
일 때, ( { 1쌍의 괄호 } ) { 2 쌍의 괄호 } 형태가 된다.len(A) == 2
일 때, ( { 2쌍의 괄호 } ) { 1 쌍의 괄호 } 형태가 된다.len(A) == 3
일 때, ( { 3쌍의 괄호 } ) 형태가 된다.()AB
는 1의 형태로 얻을 수 있다.(A)B
는 2, 3의 형태로 얻을 수 있다.A(B)
는 2, 3의 형태에서 얻은 상태이다.AB()
B
의 길이가 0
일 때, 3의 형태에서 얻을 수 있다.(AB)
는 4의 형태로 얻을 수 있다.AB
를 분할하는 경우의 수를 구하면 된다.dp[i] = sum(dp[j] * dp[i - j - 1]), j : 0 ~ i
dp[0], dp[1] = 1, 1
로 초기값을 설정한다.def dp(n: int) -> int:
memo = [0 for _ in range(n + 1)]
memo[0], memo[1] = 1, 1
for i in range(2, n + 1):
for j in range(i):
memo[i] += memo[j] * memo[i - j - 1]
return memo[-1]
def solution(n):
answer = dp(n)
return answer