diff --git a/3sum/sujeong-dev.js b/3sum/sujeong-dev.js new file mode 100644 index 0000000000..cb64b35dbc --- /dev/null +++ b/3sum/sujeong-dev.js @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * + * 시간복잡도: 이중 for문으로 O(n^2)이긴한데 너무 오래걸림 + * 해설 확인해보기 + */ +var threeSum = function (nums) { + if (nums.every((num) => num === 0)) return [nums.slice(0, 3)]; + + const threeSet = new Set(); + for (let i = 0; i < nums.length - 2; i++) { + const twoSet = new Set(); + for (let j = i + 1; j < nums.length; j++) { + const findNum = -(nums[i] + nums[j]); + if (twoSet.has(findNum)) { + const triplet = [nums[i], nums[j], findNum].sort((a, b) => a - b); + threeSet.add(triplet.join(',')); + } + twoSet.add(nums[j]); + } + } + return Array.from(threeSet, (k) => k.split(',').map(Number)); +}; diff --git a/climbing-stairs/sujeong-dev.js b/climbing-stairs/sujeong-dev.js new file mode 100644 index 0000000000..450653afbe --- /dev/null +++ b/climbing-stairs/sujeong-dev.js @@ -0,0 +1,20 @@ +/** + * @param {number} n + * @return {number} + * + * 시간복잡도 계산 + * 메모이제이션으로 n번째에는 n번째에 대한 부분만 연산되므로 O(n) + * + * 공간복잡도 계산 + * memo배열에 n번째 연산값들이 각 인덱스에 할당되므로 O(n) +d */ + +var climbStairs = function (n, memo = []) { + if (memo[n] !== undefined) return memo[n]; + + if (n <= 1) return 1; + + memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); + + return memo[n]; +}; diff --git a/product-of-array-except-self/sujeong-dev.js b/product-of-array-except-self/sujeong-dev.js new file mode 100644 index 0000000000..d961d6ed9b --- /dev/null +++ b/product-of-array-except-self/sujeong-dev.js @@ -0,0 +1,48 @@ +/** + * @param {number[]} nums + * @return {number[]} + + result[i] = (nums[0] * ... * nums[i-1]) * (nums[i+1] * nums[n-1]) + i=0 r[0]= 1 + i=1 r[1]= 1 * nums[0] = 1 + i=2 r[2]= 1 * nums[0] * nums[1] = 2 + i=3 r[3]= 1 * nums[0] * nums[1] * nums[2] = 6 + + i=0 r[0]=24 + i=1 r[1]= 1 * nums[3] * nums[2] = 12 + r=2 r[2]= 1 * nums[3] =4 + r=3 r[3]= 1 + + i=0 r[0]=1 * 24 + i=1 r[1]=1 * 12 + i=2 r[2]=2 * 4 + i=3 r[3]=6 * 1 + 인덱스를 중심으로 왼쪽 구간 원소의 곱 * 오른쪽 구간 원소의 곱 + + 시간복잡도 계산 + 왼쪽 구간 for문 nums에 비례해서 연산 + 오른쪽 구간 for문 nums에 비례해서 연산 + => O(n) + + 공간복잡도 계산 + start, end 할당(출력공간인 resultArray배열은 추가공간에서 제외된다.) + => O(1) + */ +var productExceptSelf = function (nums) { + let resultArray = Array(nums.length).fill(1); + const n = nums.length; + + let start = 1; + for (let i = 1; i < n; i++) { + start *= nums[i - 1]; + resultArray[i] = start; + } + + let end = 1; + for (let i = n - 2; i >= 0; i--) { + end *= nums[i + 1]; + resultArray[i] *= end; + } + + return resultArray; +}; diff --git a/valid-anagram/sujeong-dev.js b/valid-anagram/sujeong-dev.js new file mode 100644 index 0000000000..66f434b53a --- /dev/null +++ b/valid-anagram/sujeong-dev.js @@ -0,0 +1,30 @@ +/** + * @param {string} s + * @param {string} t + * @return {boolean} + * + * 시간복잡도 계산 + * 문자열 s 길이만큼 Map에 set => n + * 문자열 t 길이만큼 Map에 set => n + * 따라서 O(n) + * + * 공간복잡도 계산 + * 문자열 s, t의 길이만큼 Map에 할당되니까 O(n) + */ +var isAnagram = function (s, t) { + if (s.length !== t.length) return false; + + const frequencyMap = new Map(); + + for (const x of s) { + frequencyMap.set(x, (frequencyMap.get(x) || 0) + 1); + } + + for (const y of t) { + if (!frequencyMap.has(y)) return false; + frequencyMap.set(y, frequencyMap.get(y) - 1); + if (frequencyMap.get(y) === 0) frequencyMap.delete(y); + } + + return frequencyMap.size === 0; +};