diff --git "a/JooKangsan/10\354\243\274\354\260\250/139_Word_Break.js" "b/JooKangsan/10\354\243\274\354\260\250/139_Word_Break.js" new file mode 100644 index 0000000..955cf04 --- /dev/null +++ "b/JooKangsan/10\354\243\274\354\260\250/139_Word_Break.js" @@ -0,0 +1,32 @@ + + +/** + * @param {string} s + * @param {string[]} wordDict + * @return {boolean} + */ +var wordBreak = function(s, wordDict) { + const memo = new Map(); + + function dp(str, i = 0) { + if (str.length === 0) return true; + if (i >= wordDict.length) return false; + + const key = str + ',' + i; + if (memo.has(key)) return memo.get(key); + + let word = wordDict[i]; + if (str.slice(0, word.length) === word) { + if (dp(str.slice(word.length), 0)) { + memo.set(key, true); + return true; + } + } + + const result = dp(str, i + 1); + memo.set(key, result); + return result; + } + + return dp(s); +}; \ No newline at end of file diff --git "a/JooKangsan/10\354\243\274\354\260\250/1584_Min_Cost_to_Connect_All_Points.js" "b/JooKangsan/10\354\243\274\354\260\250/1584_Min_Cost_to_Connect_All_Points.js" new file mode 100644 index 0000000..2ffa792 --- /dev/null +++ "b/JooKangsan/10\354\243\274\354\260\250/1584_Min_Cost_to_Connect_All_Points.js" @@ -0,0 +1,34 @@ +/** + * @param {number[][]} points + * @return {number} + */ +var minCostConnectPoints = function (points) { + const n = points.length; + const visited = new Array(n).fill(false); + const minDist = new Array(n).fill(Infinity); + minDist[0] = 0; + let result = 0; + + for (let i = 0; i < n; i++) { + let x = -1; + for (let j = 0; j < n; j++) { + if (!visited[j] && (x === -1 || minDist[j] < minDist[x])) { + x = j; + } + } + + visited[x] = true; + result += minDist[x]; + + for (let k = 0; k < n; k++) { + if (!visited[k]) { + const dist = + Math.abs(points[x][0] - points[k][0]) + + Math.abs(points[x][1] - points[k][1]); + minDist[k] = Math.min(minDist[k], dist); + } + } + } + + return result; +}; diff --git "a/JooKangsan/10\354\243\274\354\260\250/215_Kth_Largest_Element_in_an_Array.js" "b/JooKangsan/10\354\243\274\354\260\250/215_Kth_Largest_Element_in_an_Array.js" new file mode 100644 index 0000000..319a06e --- /dev/null +++ "b/JooKangsan/10\354\243\274\354\260\250/215_Kth_Largest_Element_in_an_Array.js" @@ -0,0 +1,29 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {number} + */ +var findKthLargest = function(nums, k) { + let [min, max] = nums.reduce(([min, max], num) => + [Math.min(min, num), Math.max(max, num)], + [Infinity, -Infinity] + ); + + const offset = min >= 0 ? 0 : -min; + const count = new Array(max + 1 + offset).fill(0); + + for(let num of nums) { + count[num + offset]++; + } + + let kthLargest; + for(let i = count.length - 1; i >= 0; i--) { + k -= count[i]; + if(k <= 0) { + kthLargest = i - offset; + break; + } + } + + return kthLargest; +}; \ No newline at end of file diff --git "a/JooKangsan/10\354\243\274\354\260\250/235_Lowest_Common_Ancestor_of_a_Binary_Search_Tree.js" "b/JooKangsan/10\354\243\274\354\260\250/235_Lowest_Common_Ancestor_of_a_Binary_Search_Tree.js" new file mode 100644 index 0000000..8ae1d92 --- /dev/null +++ "b/JooKangsan/10\354\243\274\354\260\250/235_Lowest_Common_Ancestor_of_a_Binary_Search_Tree.js" @@ -0,0 +1,27 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val) { + * this.val = val; + * this.left = this.right = null; + * } + */ + +/** + * @param {TreeNode} root + * @param {TreeNode} p + * @param {TreeNode} q + * @return {TreeNode} + */ + +var lowestCommonAncestor = function(root, p, q) { + let min = Math.min(p.val, q.val) + let max = Math.max(p.val, q.val) + + if(min > root.val) { + return lowestCommonAncestor(root.right, p, q) + } else if(max < root.val) { + return lowestCommonAncestor(root.left, p, q) + } else { + return root + } +}; \ No newline at end of file diff --git "a/JooKangsan/10\354\243\274\354\260\250/56_Merge_Intervals.js" "b/JooKangsan/10\354\243\274\354\260\250/56_Merge_Intervals.js" new file mode 100644 index 0000000..bfc6c78 --- /dev/null +++ "b/JooKangsan/10\354\243\274\354\260\250/56_Merge_Intervals.js" @@ -0,0 +1,18 @@ +/** + * @param {number[][]} intervals + * @return {number[][]} + */ +var merge = function (intervals) { + intervals.sort((a, b) => a[0] - b[0]); + + for (let i = 1; i < intervals.length; i++) { + if (intervals[i][0] <= intervals[i - 1][1]) { + intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]); + intervals[i][0] = intervals[i - 1][0]; + intervals.splice(i - 1, 1); + i--; + } + } + + return intervals; +}; diff --git a/JooKangsan/121_Best_Time_to_Buy_and_Sell_Stock.js "b/JooKangsan/1\354\243\274\354\260\250/121_Best_Time_to_Buy_and_Sell_Stock.js" similarity index 100% rename from JooKangsan/121_Best_Time_to_Buy_and_Sell_Stock.js rename to "JooKangsan/1\354\243\274\354\260\250/121_Best_Time_to_Buy_and_Sell_Stock.js" diff --git a/JooKangsan/15_3Sum.js "b/JooKangsan/1\354\243\274\354\260\250/15_3Sum.js" similarity index 100% rename from JooKangsan/15_3Sum.js rename to "JooKangsan/1\354\243\274\354\260\250/15_3Sum.js" diff --git a/JooKangsan/217_Contains_Duplicate.js "b/JooKangsan/1\354\243\274\354\260\250/217_Contains_Duplicate.js" similarity index 100% rename from JooKangsan/217_Contains_Duplicate.js rename to "JooKangsan/1\354\243\274\354\260\250/217_Contains_Duplicate.js" diff --git a/JooKangsan/268_Missing_Number.js "b/JooKangsan/1\354\243\274\354\260\250/268_Missing_Number.js" similarity index 100% rename from JooKangsan/268_Missing_Number.js rename to "JooKangsan/1\354\243\274\354\260\250/268_Missing_Number.js" diff --git a/JooKangsan/Meeting Schedule.js "b/JooKangsan/1\354\243\274\354\260\250/Meeting Schedule.js" similarity index 100% rename from JooKangsan/Meeting Schedule.js rename to "JooKangsan/1\354\243\274\354\260\250/Meeting Schedule.js" diff --git a/JooKangsan/100_Same_Tree.js "b/JooKangsan/2\354\243\274\354\260\250/100_Same_Tree.js" similarity index 100% rename from JooKangsan/100_Same_Tree.js rename to "JooKangsan/2\354\243\274\354\260\250/100_Same_Tree.js" diff --git a/JooKangsan/191_Number_of_1_Bits.js "b/JooKangsan/2\354\243\274\354\260\250/191_Number_of_1_Bits.js" similarity index 100% rename from JooKangsan/191_Number_of_1_Bits.js rename to "JooKangsan/2\354\243\274\354\260\250/191_Number_of_1_Bits.js" diff --git a/JooKangsan/238_Product_of_Array_Except_Self.js "b/JooKangsan/2\354\243\274\354\260\250/238_Product_of_Array_Except_Self.js" similarity index 100% rename from JooKangsan/238_Product_of_Array_Except_Self.js rename to "JooKangsan/2\354\243\274\354\260\250/238_Product_of_Array_Except_Self.js" diff --git a/JooKangsan/242_Valid_Anagram.js "b/JooKangsan/2\354\243\274\354\260\250/242_Valid_Anagram.js" similarity index 100% rename from JooKangsan/242_Valid_Anagram.js rename to "JooKangsan/2\354\243\274\354\260\250/242_Valid_Anagram.js" diff --git a/JooKangsan/746_Min_Cost_Climbing_Stairs.js "b/JooKangsan/2\354\243\274\354\260\250/746_Min_Cost_Climbing_Stairs.js" similarity index 100% rename from JooKangsan/746_Min_Cost_Climbing_Stairs.js rename to "JooKangsan/2\354\243\274\354\260\250/746_Min_Cost_Climbing_Stairs.js" diff --git a/JooKangsan/125_Valid_Palindrome.js "b/JooKangsan/3\354\243\274\354\260\250/125_Valid_Palindrome.js" similarity index 100% rename from JooKangsan/125_Valid_Palindrome.js rename to "JooKangsan/3\354\243\274\354\260\250/125_Valid_Palindrome.js" diff --git a/JooKangsan/190_Reverse_Bits.js "b/JooKangsan/3\354\243\274\354\260\250/190_Reverse_Bits.js" similarity index 100% rename from JooKangsan/190_Reverse_Bits.js rename to "JooKangsan/3\354\243\274\354\260\250/190_Reverse_Bits.js" diff --git a/JooKangsan/206_Reverse_Linked_List.js "b/JooKangsan/3\354\243\274\354\260\250/206_Reverse_Linked_List.js" similarity index 100% rename from JooKangsan/206_Reverse_Linked_List.js rename to "JooKangsan/3\354\243\274\354\260\250/206_Reverse_Linked_List.js" diff --git a/JooKangsan/322_Coin_Change.js "b/JooKangsan/3\354\243\274\354\260\250/322_Coin_Change.js" similarity index 100% rename from JooKangsan/322_Coin_Change.js rename to "JooKangsan/3\354\243\274\354\260\250/322_Coin_Change.js" diff --git a/JooKangsan/49_Group_Anagrams.js "b/JooKangsan/3\354\243\274\354\260\250/49_Group_Anagrams.js" similarity index 100% rename from JooKangsan/49_Group_Anagrams.js rename to "JooKangsan/3\354\243\274\354\260\250/49_Group_Anagrams.js" diff --git a/JooKangsan/104_Maximum_Depth_of_Binary_Tree.js "b/JooKangsan/4\354\243\274\354\260\250/104_Maximum_Depth_of_Binary_Tree.js" similarity index 100% rename from JooKangsan/104_Maximum_Depth_of_Binary_Tree.js rename to "JooKangsan/4\354\243\274\354\260\250/104_Maximum_Depth_of_Binary_Tree.js" diff --git a/JooKangsan/141_Linked_List_Cycle.js "b/JooKangsan/4\354\243\274\354\260\250/141_Linked_List_Cycle.js" similarity index 100% rename from JooKangsan/141_Linked_List_Cycle.js rename to "JooKangsan/4\354\243\274\354\260\250/141_Linked_List_Cycle.js" diff --git a/JooKangsan/1_Two_Sum.js "b/JooKangsan/4\354\243\274\354\260\250/1_Two_Sum.js" similarity index 100% rename from JooKangsan/1_Two_Sum.js rename to "JooKangsan/4\354\243\274\354\260\250/1_Two_Sum.js" diff --git a/JooKangsan/202_Happy_Number.js "b/JooKangsan/4\354\243\274\354\260\250/202_Happy_Number.js" similarity index 100% rename from JooKangsan/202_Happy_Number.js rename to "JooKangsan/4\354\243\274\354\260\250/202_Happy_Number.js" diff --git a/JooKangsan/20_Valid_Parentheses.js "b/JooKangsan/4\354\243\274\354\260\250/20_Valid_Parentheses.js" similarity index 100% rename from JooKangsan/20_Valid_Parentheses.js rename to "JooKangsan/4\354\243\274\354\260\250/20_Valid_Parentheses.js" diff --git "a/JooKangsan/5\354\243\274\354\260\250/1046_Last_Stone_Weight.js" "b/JooKangsan/5\354\243\274\354\260\250/1046_Last_Stone_Weight.js" new file mode 100644 index 0000000..a8e11c3 --- /dev/null +++ "b/JooKangsan/5\354\243\274\354\260\250/1046_Last_Stone_Weight.js" @@ -0,0 +1,15 @@ +/** + * @param {number[]} stones + * @return {number} + */ +var lastStoneWeight = function (stones) { + while (stones.length > 1) { + stones.sort((a, b) => b - a); + const first = stones.shift(); + const second = stones.shift(); + if (first !== second) { + stones.push(first - second); + } + } + return stones.length === 0 ? 0 : stones[0]; +}; diff --git "a/JooKangsan/5\354\243\274\354\260\250/21_Merge_Two_Sorted_Lists.js" "b/JooKangsan/5\354\243\274\354\260\250/21_Merge_Two_Sorted_Lists.js" new file mode 100644 index 0000000..37aec34 --- /dev/null +++ "b/JooKangsan/5\354\243\274\354\260\250/21_Merge_Two_Sorted_Lists.js" @@ -0,0 +1,23 @@ +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} list1 + * @param {ListNode} list2 + * @return {ListNode} + */ +var mergeTwoLists = function (list1, list2) { + if (list1 == null) return list2; + if (list2 == null) return list1; + if (list1.val <= list2.val) { + list1.next = mergeTwoLists(list1.next, list2); + return list1; + } else { + list2.next = mergeTwoLists(list1, list2.next); + return list2; + } +}; diff --git "a/JooKangsan/5\354\243\274\354\260\250/338_Counting_Bits.js" "b/JooKangsan/5\354\243\274\354\260\250/338_Counting_Bits.js" new file mode 100644 index 0000000..128e1c1 --- /dev/null +++ "b/JooKangsan/5\354\243\274\354\260\250/338_Counting_Bits.js" @@ -0,0 +1,13 @@ +/** + * @param {number} n + * @return {number[]} + */ +var countBits = function (n) { + const ans = new Array(n + 1).fill(0); + + for (let i = 1; i <= n; i++) { + ans[i] = ans[Math.floor(i / 2)] + (i % 2); + } + + return ans; +}; diff --git "a/JooKangsan/5\354\243\274\354\260\250/48_Rotate_Image.js" "b/JooKangsan/5\354\243\274\354\260\250/48_Rotate_Image.js" new file mode 100644 index 0000000..aec7e05 --- /dev/null +++ "b/JooKangsan/5\354\243\274\354\260\250/48_Rotate_Image.js" @@ -0,0 +1,14 @@ +/** + * @param {number[][]} matrix + * @return {void} Do not return anything, modify matrix in-place instead. + */ +var rotate = function (matrix) { + for (let i = 0; i < matrix.length; i++) { + for (let j = i + 1; j < matrix.length; j++) { + [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]]; + } + } + for (let i = 0; i < matrix.length; i++) { + matrix[i].reverse(); + } +}; diff --git "a/JooKangsan/5\354\243\274\354\260\250/70_Climbing_Stairs.js" "b/JooKangsan/5\354\243\274\354\260\250/70_Climbing_Stairs.js" new file mode 100644 index 0000000..93ddac8 --- /dev/null +++ "b/JooKangsan/5\354\243\274\354\260\250/70_Climbing_Stairs.js" @@ -0,0 +1,14 @@ +/** + * @param {number} n + * @return {number} + */ +var climbStairs = function (n) { + if (n <= 2) return n; + const step = new Array(n + 1).fill(0); + step[1] = 1; + step[2] = 2; + for (let i = 3; i <= n; i++) { + step[i] = step[i - 1] + step[i - 2]; + } + return step[n]; +}; diff --git "a/JooKangsan/6\354\243\274\354\260\250/ 703_Kth_Largest_Element_in_a_Stream.js" "b/JooKangsan/6\354\243\274\354\260\250/ 703_Kth_Largest_Element_in_a_Stream.js" new file mode 100644 index 0000000..7f92245 --- /dev/null +++ "b/JooKangsan/6\354\243\274\354\260\250/ 703_Kth_Largest_Element_in_a_Stream.js" @@ -0,0 +1,63 @@ +/** + * @param {number} k + * @param {number[]} nums + */ +var KthLargest = function(k, nums) { + this.k = k; + this.h = []; + + // populate the array + const limit = Math.min(this.k, nums.length); + for(let i = 0; i < limit; i++) { + this.h.push(nums[i]); + } + this.heapifyBottomUp(); + // add remaining elements + for(let i = k; i < nums.length; i++) { + this.add(nums[i]); + } +}; + +KthLargest.prototype.heapifyBottomUp = function() { + const firstLeafAt = Math.floor(this.h.length/2); + for(let i = firstLeafAt - 1; i >= 0; i--) { + this.heapify(i); + } +} + +KthLargest.prototype.heapify = function(i) { + const l = 2*i + 1; + const r = 2*i + 2; + + let min = i; + + if(l < this.h.length && this.h[l] < this.h[min]) { + min = l + } + + if(r < this.h.length && this.h[r] < this.h[min]) { + min = r; + } + + if(min != i) { + [this.h[i], this.h[min]] = [this.h[min], this.h[i]]; + this.heapify(min) + } +}; + +/** +* @param {number} val +* @return {number} +*/ +KthLargest.prototype.add = function(val) { + if(this.h.length < this.k) { // heap is not full + this.h.push(val); + this.heapifyBottomUp(); + } else { + if(val > this.h[0]) { + this.h[0] = val; + this.heapify(0) + } + } + return this.h[0]; +}; \ No newline at end of file diff --git "a/JooKangsan/6\354\243\274\354\260\250/198_House_Robber.js" "b/JooKangsan/6\354\243\274\354\260\250/198_House_Robber.js" new file mode 100644 index 0000000..a4443db --- /dev/null +++ "b/JooKangsan/6\354\243\274\354\260\250/198_House_Robber.js" @@ -0,0 +1,18 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var rob = function (nums) { + let n = nums.length; + if (n === 0) return 0; + if (n === 1) return nums[0]; + + let dp = new Array(n + 1).fill(0); + dp[1] = nums[0]; + + for (let i = 2; i <= n; i++) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]); + } + + return dp[n]; +}; diff --git "a/JooKangsan/6\354\243\274\354\260\250/271_Encode_and_Decode_Strings.js" "b/JooKangsan/6\354\243\274\354\260\250/271_Encode_and_Decode_Strings.js" new file mode 100644 index 0000000..0bf15a0 --- /dev/null +++ "b/JooKangsan/6\354\243\274\354\260\250/271_Encode_and_Decode_Strings.js" @@ -0,0 +1,27 @@ +class Solution { + /** + * @param {string[]} strs + * @returns {string} + */ + encode(strs) { + return strs.map((s) => `${s.length}#${s}`).join(""); + } + + /** + * @param {string} str + * @returns {string[]} + */ + decode(str) { + let i = 0; + const result = []; + + while (i < str.length) { + let j = str.indexOf("#", i); + let length = parseInt(str.slice(i, j), 10); + result.push(str.slice(j + 1, j + 1 + length)); + i = j + 1 + length; + } + + return result; + } +} diff --git "a/JooKangsan/6\354\243\274\354\260\250/66_Plus_One.js" "b/JooKangsan/6\354\243\274\354\260\250/66_Plus_One.js" new file mode 100644 index 0000000..81c2f98 --- /dev/null +++ "b/JooKangsan/6\354\243\274\354\260\250/66_Plus_One.js" @@ -0,0 +1,8 @@ +/** + * @param {number[]} digits + * @return {number[]} + */ +var plusOne = function (digits) { + const join = BigInt(digits.join("")) + 1n; + return join.toString().split("").map(Number); +}; diff --git "a/JooKangsan/6\354\243\274\354\260\250/704_Binary_Search.js" "b/JooKangsan/6\354\243\274\354\260\250/704_Binary_Search.js" new file mode 100644 index 0000000..3f0a314 --- /dev/null +++ "b/JooKangsan/6\354\243\274\354\260\250/704_Binary_Search.js" @@ -0,0 +1,22 @@ +/** + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +var search = function(nums, target) { + let left = 0; + let right = nums.length - 1; + while (left <= right) { + const center = Math.floor((left + right) / 2); + + if (nums[center] === target) { + return center; + } else if (nums[center] < target) { + left = center + 1; + } else { + right = center - 1; + } + } + + return -1; +} \ No newline at end of file diff --git "a/JooKangsan/7\354\243\274\354\260\250/110_Balanced_Binary_Tree.js" "b/JooKangsan/7\354\243\274\354\260\250/110_Balanced_Binary_Tree.js" new file mode 100644 index 0000000..8158c2e --- /dev/null +++ "b/JooKangsan/7\354\243\274\354\260\250/110_Balanced_Binary_Tree.js" @@ -0,0 +1,38 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {boolean} + */ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +var isBalanced = function (root) { + function checkHeight(node) { + if (!node) return 0; + + const leftHeight = checkHeight(node.left); + + if (leftHeight === -1) return -1; + + const rightHeight = checkHeight(node.right); + + if (rightHeight === -1) return -1; + + if (Math.abs(leftHeight - rightHeight) > 1) return -1; + + return Math.max(leftHeight, rightHeight) + 1; + } + return checkHeight(root) !== -1; +}; diff --git "a/JooKangsan/7\354\243\274\354\260\250/136_Single_Numver.js" "b/JooKangsan/7\354\243\274\354\260\250/136_Single_Numver.js" new file mode 100644 index 0000000..e2bed4b --- /dev/null +++ "b/JooKangsan/7\354\243\274\354\260\250/136_Single_Numver.js" @@ -0,0 +1,10 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var singleNumber = function (nums) { + nums.sort((a, b) => a - b); + for (let i = 0; i < nums.length; i += 2) { + if (nums[i] !== nums[i + 1]) return nums[i]; + } +}; diff --git "a/JooKangsan/7\354\243\274\354\260\250/155_Min_Stack.js" "b/JooKangsan/7\354\243\274\354\260\250/155_Min_Stack.js" new file mode 100644 index 0000000..1702683 --- /dev/null +++ "b/JooKangsan/7\354\243\274\354\260\250/155_Min_Stack.js" @@ -0,0 +1,33 @@ +class MinStack { + constructor() { + this.stack = []; + this.minStack = []; + } + push(val) { + this.stack.push(val); + + if (this.minStack.length === 0 || val <= this.getMin()) { + this.minStack.push(val); + } + } + pop() { + if (this.stack.pop() === this.getMin()) { + this.minStack.pop(); + } + } + top() { + return this.stack[this.stack.length - 1]; + } + getMin() { + return this.minStack[this.minStack.length - 1]; + } +} + +/** +* Your MinStack object will be instantiated and called as such: +* var obj = new MinStack() +* obj.push(val) +* obj.pop() +* var param_3 = obj.top() +* var param_4 = obj.getMin() +*/ diff --git "a/JooKangsan/7\354\243\274\354\260\250/54_Spiral_Matrix.js" "b/JooKangsan/7\354\243\274\354\260\250/54_Spiral_Matrix.js" new file mode 100644 index 0000000..56b582d --- /dev/null +++ "b/JooKangsan/7\354\243\274\354\260\250/54_Spiral_Matrix.js" @@ -0,0 +1,27 @@ +/** + * @param {number[][]} matrix + * @return {number[]} + */ +var spiralOrder = function(matrix) { + const result = []; + + while(matrix.length > 0) { + if(matrix.length > 0) { + result.push(...matrix.shift()); + } + for(let i = 0; i < matrix.length; i++) { + if(matrix[i].length > 0) { + result.push(matrix[i].pop()); + } + } + if(matrix.length > 0) { + result.push(...matrix.pop().reverse()); + } + for(let i = matrix.length - 1; i >= 0; i--) { + if(matrix[i].length > 0) { + result.push(matrix[i].shift()); + } + } + } + return result; +} \ No newline at end of file diff --git "a/JooKangsan/7\354\243\274\354\260\250/973_K_Closest_Points_to_Origin.js" "b/JooKangsan/7\354\243\274\354\260\250/973_K_Closest_Points_to_Origin.js" new file mode 100644 index 0000000..1817da2 --- /dev/null +++ "b/JooKangsan/7\354\243\274\354\260\250/973_K_Closest_Points_to_Origin.js" @@ -0,0 +1,17 @@ +/** + * @param {number[][]} points + * @param {number} k + * @return {number[][]} + */ +var kClosest = function(points, k) { + const result = []; + + for(let i = 0; i < points.length; i++) { + result.push([ + points[i][0]**2 + points[i][1]**2, + i + ]); + } + result.sort((a, b) => a[0] - b[0]); + return result.slice(0, k).map(item => points[item[1]]); +}; \ No newline at end of file diff --git "a/JooKangsan/8\354\243\274\354\260\250/128_Longest_Consecutive_Sequence.js" "b/JooKangsan/8\354\243\274\354\260\250/128_Longest_Consecutive_Sequence.js" new file mode 100644 index 0000000..31eafb4 --- /dev/null +++ "b/JooKangsan/8\354\243\274\354\260\250/128_Longest_Consecutive_Sequence.js" @@ -0,0 +1,20 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var longestConsecutive = function(nums) { + const numSet = new Set(nums); +let longestStreak = 0; +for (const num of numSet) { +if (!numSet.has(num - 1)) { + let currentNum = num; + let currentStreak = 1; + while (numSet.has(currentNum + 1)) { + currentNum += 1; + currentStreak += 1; + } + longestStreak = Math.max(longestStreak, currentStreak); +} +} +return longestStreak; +}; diff --git "a/JooKangsan/8\354\243\274\354\260\250/208_Implement_Trie(PrefixTree).js" "b/JooKangsan/8\354\243\274\354\260\250/208_Implement_Trie(PrefixTree).js" new file mode 100644 index 0000000..f41c597 --- /dev/null +++ "b/JooKangsan/8\354\243\274\354\260\250/208_Implement_Trie(PrefixTree).js" @@ -0,0 +1,61 @@ +var Trie = function() { + this.root = { + children : {}, + isEnd : false + } +}; + +/** +* @param {string} word +* @return {void} +*/ +Trie.prototype.insert = function(word) { + let node = this.root; + + for(let char of word) { + if(!node.children[char]) { + node.children[char] = { + children: {}, + isEnd: false + }; + } + node = node.children[char]; + } + + node.isEnd = true; +}; + +/** +* @param {string} word +* @return {boolean} +*/ +Trie.prototype.search = function(word) { + let node = this.root; + + // 단어의 각 문자에 대해 + for(let char of word) { + if(!node.children[char]) { + return false; + } + node = node.children[char]; + } + + return node.isEnd; +}; + +/** +* @param {string} prefix +* @return {boolean} +*/ +Trie.prototype.startsWith = function(prefix) { + let node = this.root; + + for(let char of prefix) { + if(!node.children[char]) { + return false; + } + node = node.children[char]; + } + + return true; +}; \ No newline at end of file diff --git "a/JooKangsan/8\354\243\274\354\260\250/226_Invert_Binary_Tree.js" "b/JooKangsan/8\354\243\274\354\260\250/226_Invert_Binary_Tree.js" new file mode 100644 index 0000000..c4e8981 --- /dev/null +++ "b/JooKangsan/8\354\243\274\354\260\250/226_Invert_Binary_Tree.js" @@ -0,0 +1,22 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {TreeNode} + */ +var invertTree = function (root) { + if (root === null) return null; + + let temp = root.left; + + root.left = invertTree(root.right); + root.right = invertTree(temp); + + return root; +}; diff --git "a/JooKangsan/8\354\243\274\354\260\250/371_Sum_of_Two_Integers.js" "b/JooKangsan/8\354\243\274\354\260\250/371_Sum_of_Two_Integers.js" new file mode 100644 index 0000000..ce07cff --- /dev/null +++ "b/JooKangsan/8\354\243\274\354\260\250/371_Sum_of_Two_Integers.js" @@ -0,0 +1,13 @@ +/** + * @param {number} a + * @param {number} b + * @return {number} + */ +var getSum = function(a, b) { + while (b !== 0) { + let carry = a & b; + a = a ^ b; + b = carry << 1; + } + return a; +}; \ No newline at end of file diff --git "a/JooKangsan/8\354\243\274\354\260\250/543_Diameter_of_Binary_Tree.js" "b/JooKangsan/8\354\243\274\354\260\250/543_Diameter_of_Binary_Tree.js" new file mode 100644 index 0000000..7068f26 --- /dev/null +++ "b/JooKangsan/8\354\243\274\354\260\250/543_Diameter_of_Binary_Tree.js" @@ -0,0 +1,30 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number} + */ +var diameterOfBinaryTree = function(root) { + let maxDiameter = 0; + +function getHeight(node) { + if (!node) return -1; + + let leftHeight = getHeight(node.left); + let rightHeight = getHeight(node.right); + + maxDiameter = Math.max(maxDiameter, leftHeight + rightHeight + 2); + + return Math.max(leftHeight, rightHeight) + 1; +} + +getHeight(root); + +return maxDiameter; +}; \ No newline at end of file diff --git "a/JooKangsan/9\354\243\274\354\260\250/102_Binary Tree_Level_Order_Traversal.js" "b/JooKangsan/9\354\243\274\354\260\250/102_Binary Tree_Level_Order_Traversal.js" new file mode 100644 index 0000000..4d4c116 --- /dev/null +++ "b/JooKangsan/9\354\243\274\354\260\250/102_Binary Tree_Level_Order_Traversal.js" @@ -0,0 +1,35 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @return {number[][]} + */ +var levelOrder = function(root) { + if (!root) return []; + + const result = []; + const queue = [root]; + + while (queue.length > 0) { + const levelSize = queue.length; + const currentLevel = []; + + for (let i = 0; i < levelSize; i++) { + const node = queue.shift(); + currentLevel.push(node.val); + + if (node.left) queue.push(node.left); + if (node.right) queue.push(node.right); + } + + result.push(currentLevel); + } + + return result; +}; \ No newline at end of file diff --git "a/JooKangsan/9\354\243\274\354\260\250/150_Evaluate_Reverse_Polish_Notation.js" "b/JooKangsan/9\354\243\274\354\260\250/150_Evaluate_Reverse_Polish_Notation.js" new file mode 100644 index 0000000..19ea93e --- /dev/null +++ "b/JooKangsan/9\354\243\274\354\260\250/150_Evaluate_Reverse_Polish_Notation.js" @@ -0,0 +1,38 @@ +/** + * @param {string[]} tokens + * @return {number} + */ +var evalRPN = function (tokens) { + while (tokens.length > 1) { + for (let i = 0; i < tokens.length; i++) { + if (["+", "-", "*", "/"].includes(tokens[i])) { + const num1 = Number(tokens[i - 2]); + const num2 = Number(tokens[i - 1]); + const operator = tokens[i]; + let result; + + switch (operator) { + case "+": + result = num1 + num2; + break; + case "-": + result = num1 - num2; + break; + case "*": + result = num1 * num2; + break; + case "/": + result = + num1 / num2 > 0 + ? Math.floor(num1 / num2) + : Math.ceil(num1 / num2); + break; + } + + tokens.splice(i - 2, 3, result.toString()); + break; + } + } + } + return Number(tokens[0]); +}; diff --git "a/JooKangsan/9\354\243\274\354\260\250/203_House_Robber_II.js" "b/JooKangsan/9\354\243\274\354\260\250/203_House_Robber_II.js" new file mode 100644 index 0000000..397ea13 --- /dev/null +++ "b/JooKangsan/9\354\243\274\354\260\250/203_House_Robber_II.js" @@ -0,0 +1,32 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var rob = function (nums) { + let n = nums.length; + if (n === 0) return 0; + if (n === 1) return nums[0]; + if (n === 2) return Math.max(nums[0], nums[1]); + + let firstCase = [...nums]; + firstCase.pop(); + let first = robHelper(firstCase); + + let secondCase = [...nums]; + secondCase.shift(); + let second = robHelper(secondCase); + + return Math.max(first, second); +}; + +function robHelper(houses) { + let n = houses.length; + let dp = new Array(n).fill(0); + dp[0] = houses[0]; + dp[1] = Math.max(houses[0], houses[1]); + + for (let i = 2; i < n; i++) { + dp[i] = Math.max(dp[i - 1], dp[i - 2] + houses[i]); + } + return dp[n - 1]; +} diff --git "a/JooKangsan/9\354\243\274\354\260\250/572_Subtree_of_Another_Tree.js" "b/JooKangsan/9\354\243\274\354\260\250/572_Subtree_of_Another_Tree.js" new file mode 100644 index 0000000..a1c3b9d --- /dev/null +++ "b/JooKangsan/9\354\243\274\354\260\250/572_Subtree_of_Another_Tree.js" @@ -0,0 +1,29 @@ +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @param {TreeNode} subRoot + * @return {boolean} + */ +var isSubtree = function(root, subRoot) { + if (!subRoot) return true; + if (!root) return false; + + const isSameTree = (tree1, tree2) => { + if (!tree1 && !tree2) return true; + if (!tree1 || !tree2) return false; + if (tree1.val !== tree2.val) return false; + return isSameTree(tree1.left, tree2.left) && + isSameTree(tree1.right, tree2.right); + }; + + return isSameTree(root, subRoot) || + isSubtree(root.left, subRoot) || + isSubtree(root.right, subRoot); +}; \ No newline at end of file