diff --git a/insert-interval/YeomChaeeun.ts b/insert-interval/YeomChaeeun.ts new file mode 100644 index 000000000..4ededc18f --- /dev/null +++ b/insert-interval/YeomChaeeun.ts @@ -0,0 +1,38 @@ +/** + * 중간에 새로운 구간 추가하기 + * 알고리즘 복잡도 + * - 시간 복잡도: O(n) + * - 공간 복잡도: O(n) + * @param intervals + * @param newInterval + */ +function insert(intervals: number[][], newInterval: number[]): number[][] { + if(intervals.length === 0) return [newInterval] + let result: number[][] = [] + + let i = 0; + + // 1. newIntervals 이전 구간 추가 + while(i < intervals.length && intervals[i][1] < newInterval[0]) { + result.push(intervals[i]) + i++ + } + + // 2. 겹치는 부분 추가 + const merged = [...newInterval] + while(i < intervals.length && intervals[i][0] <= newInterval[1]) { + merged[0] = Math.min(merged[0], intervals[i][0]) + merged[1] = Math.max(merged[1], intervals[i][1]) + i++ + } + result.push(merged) + + // 3. 이후의 구간 추가 + while(i < intervals.length) { + result.push(intervals[i]) + i++ + } + + return result +} + diff --git a/kth-smallest-element-in-a-bst/YeomChaeeun.ts b/kth-smallest-element-in-a-bst/YeomChaeeun.ts new file mode 100644 index 000000000..e21bf6fcb --- /dev/null +++ b/kth-smallest-element-in-a-bst/YeomChaeeun.ts @@ -0,0 +1,47 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ +/** + * Binary Search Tree 특성을 고려하여 k번째 작은 숫자를 찾기 + * 알고리즘 복잡도 + * - 시간 복잡도: O(n) + * - 공간 복잡도: O(n) + */ +function kthSmallest(root: TreeNode | null, k: number): number { + let count = 0; + let result = 0; + + /* + BST의 특성 + - 왼쪽 서브트리의 노드 값 < 현재 노드 값 + - 현재 노드값 < 왼쪽 서브트리의 노드 값 + => 중위 순회시 오름차 순 방문 + */ + + // 중위 순회 함수 + function inorder(node: TreeNode | null): void { + if (node === null) return; + inorder(node.left); + + count++; + if (count === k) { + result = node.val; + return; + } + + inorder(node.right); + } + + inorder(root); + return result; +} diff --git a/lowest-common-ancestor-of-a-binary-search-tree/YeomChaeeun.ts b/lowest-common-ancestor-of-a-binary-search-tree/YeomChaeeun.ts new file mode 100644 index 000000000..db8c2603b --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/YeomChaeeun.ts @@ -0,0 +1,34 @@ +/** + * Definition for a binary tree node. + * class TreeNode { + * val: number + * left: TreeNode | null + * right: TreeNode | null + * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + * } + */ +/** + * BST 이진트리에 두 노드가 주어졌을 때, 근접한 부모 찾기 + * 알고리즘 복잡도 + * - 시간 복잡도: O(n) + * - 공간 복잡도: O(n) + * @param root + * @param p + * @param q + */ +function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null { + if(root === null || p === null || q === null) return null; + + if(p.val < root.val && q.val < root.val) { + return lowestCommonAncestor(root.left, p, q) + } else if(p.val > root.val && q.val > root.val) { + return lowestCommonAncestor(root.right, p, q) + } else { + // 현재 노드가 양쪽 방향으로 있거나 현재 노드가 p, q인 경우 + return root + } +}