Leetcode Java Unique Binary Search Trees
업데이트:
문제
코드
class Solution {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[i - j] * dp[j - 1];
}
}
return dp[n];
}
}
결과
설명
-
주어진 정수 n을 이용해서 이진 트리를 구성하는 경우의 수를 구하는 문제이다.
-
문제 풀이를 위해 dp를 주어진 정수인 n보다 1 크게 정의하고, 0과 1 자리에 1을 넣어 초기화 시킨다.
-
i는 dp의 초기화 되지 않은 2번째 자리에서 n까지 값을 증가시키며 반복한다.
-
j는 1부터 i까지 증가시키며 반복한다.
- dp[n]을 구하기 위한 값을 풀어보면 아래와 같다.
- $dp[2] = dp[0] * dp[1] + dp[1] * dp[0] = 2$
- $dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[1] + dp[2] * dp[0] = 5$
- $dp[n] = dp[0] * dp[n - 1] + dp[1] * dp[n - 2] + … + $ $dp[n - 2] * dp[1] + dp[n - 1] * dp[0]$
- 위의 식대로 풀이해보면, 3번과 4번의 반복을 수행하여 $dp[i] += dp[i - j] * dp[j - 1]$로 dp[i]의 값을 넣어준다.
- 반복이 완료되면 완성된 dp의 n번째 값인 dp[n]의 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기