From a57928c3c97b2e9a6ee057d80df0de240400ed29 Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 02:17:29 +0900 Subject: [PATCH 1/9] 1. two sum --- two-sum/whewchews.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 two-sum/whewchews.ts diff --git a/two-sum/whewchews.ts b/two-sum/whewchews.ts new file mode 100644 index 000000000..1ce313543 --- /dev/null +++ b/two-sum/whewchews.ts @@ -0,0 +1,28 @@ +function twoSum(nums: number[], target: number): number[] { + /* + * 아이디어 + * 처음부터 배열을 순회하며 [0,1] [0,2] [0,3] [0, ...], [1,2], [1,3], [1,...] ... [nums.length-2, nums.length-1] 를 돌면서 두 인자의 합이 target이 되는 지점을 찾는다. + * 순서대로 돌면 최악의 경우 가장 마지막 자리까지 갈 수도 있다. + * 절대 값이 되지 못하는, 최소 조건을 생각해보자. + * 주의1:범위가 -10^9 <= nums[i] <= 10^9로 음수값도 있음 + * 주의2: 정렬된 순서가 아님. + * 값을 Map에 저장해두고 {value: index}, Map에 자신과 더했을때 target이 나오는 value가 있는지 확인 + */ + + // SC: O(N) + const dict = new Map(); + + // TC: O(N) + for (let i = 0; i <= nums.length - 1; i++) { + const curr = nums[i]; + const pairValue = target - curr; + if (dict.has(pairValue)) { + return [dict.get(pairValue), i]; + } + + dict.set(curr, i); + } +} + +// TC: O(N) +// SC: O(N) From 23bfc3dce61b0e6a6b84228e1009caa5d3a5905a Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 02:22:11 +0900 Subject: [PATCH 2/9] 2. climbing stairs --- climbing-stairs/whewchews.ts | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 climbing-stairs/whewchews.ts diff --git a/climbing-stairs/whewchews.ts b/climbing-stairs/whewchews.ts new file mode 100644 index 000000000..2ce050bb0 --- /dev/null +++ b/climbing-stairs/whewchews.ts @@ -0,0 +1,54 @@ +function climbStairs(n: number): number { + /* + * 아이디어 + * 층수 제한: 1 <= n <= 45 + * 1 or 2 step 만 올라갈 수 있음 + + * 1 -> [1] + * 2 -> [1,1] [2] + * 3 -> [1,1,1] [2,1] [1,2] + * 4 -> [1,1,1,1] [2,1,1] [1,2,1] [1,1,2] [2,2] + * 5 -> [1,1,1,1,1] [2,1,1,1] [1,2,1,1] [1,1,2,1] [1,1,1,2] [2,2,1], [1,2,2], [2,1,2] + * 6 -> [1,1,1,1,1,1] [2,1,1,1,1] [...] [1,1,1,1,2] [2,2,1,1], [2,1,2,1], [2,1,1,2] [1,1,2,2], [1,2,1,2], [1,2,2,1] + => (1-n, 2-0) n가지 (1:n-2, 2:1) (n-1)*(n-2)/(n-2) 가지 (1: n-4, 2: n/2) (n-2)*(n-3)/2 가지 + */ + + // # solution 1 + // TC: O(N) + // SC: O(N) + // const stair = {1: 1, 2:2} + // for(let i = 3; i<=n; i++){ + // stair[i] = stair[i-1] + stair[i-2] + // } + + // # solution 2 + // TC: O(N) + // SC: O(1) + // if(n < 3) return n + // let curr = 2 + // let prev = 1 + + // for(let i=0; i Date: Sat, 31 Aug 2024 02:25:38 +0900 Subject: [PATCH 3/9] 3. Product of Array Except Self --- product-of-array-except-self/whewchews.ts | 68 +++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 product-of-array-except-self/whewchews.ts diff --git a/product-of-array-except-self/whewchews.ts b/product-of-array-except-self/whewchews.ts new file mode 100644 index 000000000..e30a890a4 --- /dev/null +++ b/product-of-array-except-self/whewchews.ts @@ -0,0 +1,68 @@ +function productExceptSelf(nums: number[]): number[] { + /* #Solution 1 + * sum: 전체 곱을 구한다. + * zeroCount: 0의 개수가 몇개인지 센다. + * 1. 자신이 0이면, + * 1-1. 자신이외의 0이 있는지 확인하고 있으면 0을 return + * 1-2. 자신 이외에 0이 없으면 전체 곱을 return + * 2. 자신이 0이 아니면 + * 2-1. zeroCount가 있는지 보고 있으면 0을 return + * 2-2. zero가 없으면 sum/self를 return + */ + let zeroCount = 0; + const sum = nums.reduce((p, c) => { + if (c === 0) { + zeroCount += 1; + return p; + } + p = p * c; + return p; + }, 1); + + const hasZero = zeroCount > 0; + + if (zeroCount === nums.length) return Array(nums.length).fill(0); + + return nums.map((n) => { + if (n === 0) { + // 자신 이외에 0이 있을때 + if (zeroCount - 1 > 0) { + return 0; + } + + return sum; + } + + if (hasZero) return 0; + return sum / n; + }); + // TC: O(N) + // SC: O(N) + + /* #Solution 2 + * 1. prefix: 자신을 제외한 자기 인덱스 앞까지의 곱을 저장한다. + * 2. suffix: 자신을 제외한 자기 뒤까지의 곱을 저장한다. + * 3. answer[i] = prefix[i] * suffix[i] + */ + // const n = nums.length; + + // const prefix = new Array(n).fill(1); + // const suffix = new Array(n).fill(1); + + // for (let i = 1; i < n; i++) { + // prefix[i] = prefix[i - 1] * nums[i - 1]; + // } + + // for (let i = n - 2; i >= 0; i--) { + // suffix[i] = suffix[i + 1] * nums[i + 1]; + // } + + // const answer = []; + // for (let i = 0; i < n; i++) { + // answer[i] = prefix[i] * suffix[i]; + // } + + // return answer; +} +// TC: O(N) +// SC: O(N) From f62a2c0c5bc7caac8b0a54b28c59c258a85205cb Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 03:12:24 +0900 Subject: [PATCH 4/9] 4. Combination Sum --- combination-sum/whewchews.ts | 123 +++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 combination-sum/whewchews.ts diff --git a/combination-sum/whewchews.ts b/combination-sum/whewchews.ts new file mode 100644 index 000000000..f0d5fc7e1 --- /dev/null +++ b/combination-sum/whewchews.ts @@ -0,0 +1,123 @@ +function combinationSum(candidates: number[], target: number): number[][] { + /* + * 합이 target이 되는 candidates 경우의 수를 리턴 + * cadidates는 고유함 + * 합이 target이 되지 않는 경우, 빈배열 리턴 + * cadidate을 중복 사용 가능 + * 2 <= candidates[i] <= 40 + * => candidate이 1인 경우는 없음 + * candidates에서 target보다 같거나 작은 값만 filter하고 시작 (target보다 큰 값은 후보군이 될 수 없음) + * + + * [2,3,6,7] / 7 + * + * [] + * [2] / 5 + * [2, 2] 3 => X + * [2, 2, 2] 1 => X + * [2, 2, 2, 2] -1 => X + * [2, 2, 2, 3] -2 => X + * [2, 2, 2, 6] -5 => X + * [2, 2, 2, 7] -6 => X + [2, 2, 3] 0 => O + // ... + [2, 3] 2 => X + [2, 3, 2] 0 => O + // ... + [2, 6] -1 => X + // ... + + * + * 하나씩 값을 추가하면서 배열의 총합을 target 값과 비교한다 + * sum이 target값보다 작으면 계속 다음 값을 추가해준다 + * sum이 target과 같으면 결과 값 result 배열에 추가해준다. + * sum이 target보다 넘으면 마지막에 추가한 값을 뺀다. + * 이 과정을 반복하며 배열에서 결과 값을 찾는다. + * + */ + + // TC: O(2^N) N = candidates.length + // SC: O(T) T = target + function backtrack(candidates: number[], start:number, total:number){ + if(target === total){ + result.push([...path]) + return + } + + if(target < total){ + return + } + + for(let i=start; i<=candidates.length-1; i++){ + path.push(candidates[i]) + backtrack(candidates, i,total + candidates[i]) + path.pop() + } + } + + const result = [] + const path = [] + // TC: O(NlogN) + // SC: O(N) + const filteredCandidates = candidates.filter(candidate => candidate<=target).sort((a,b)=> a-b) + backtrack(filteredCandidates, 0, 0) + return result + + }; + // TC: O(2^N) + // SC: O(2^N) + + /* #Solution 2 : DP + * candidates을 가지고 target 값을 만들 수 있는 모든 조합을 미리 찾아둔다. + *candidates [2,3,6,7] / target 7 라고 했을때 + * 1) candidate = 2 + * dp[2] = [[2]] + * dp[4] = [[2,2]] + * dp[6] = [[2,2,2]] + * 2) candidate = 3 + * dp[3] = [[3]] + * dp[5] = [[2,3]] + * dp[6] = [[2,2,2], [3,3]] + * dp[7] = [[2,2,3]] + * 3) candidate = 6 + * dp[6] = [[[2,2,2], [3,3], [6]] + * 4) candidate = 7 + * dp[7] = [[2,2,3], [7]] + * + * => dp = [ + * [ [] ] + * [ [] ] + * [ [2] ] + * [[3]] + * [[2,2]] + * [[2,3,]] + * [[2,2,2], [3,3], [6]] + * [[2,2,3], [7]] + * ] + * ] + * / + + + + // SC: O(T+1) T = target + const dp = Array.from({ length: target + 1 }, () => []); + dp[0] = [[]]; + + +// TC: O(C), C = candidates.length + for (let candidate of candidates) { + // TC: O(T) T = target + for (let i = candidate; i <= target; i++) { + // TC: O(K) K = dp[i - candidate].length + // SC: O(K) + for (let combination of dp[i - candidate]) { + dp[i].push([...combination, candidate]); + } + } + } + + return dp[target]; +} + +// TC: O(C * T * K) +// SC: O((T+1) * K* T) \ No newline at end of file From ba002c45df8190f51dd7c8ac03b9bd15f28eca0f Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 03:12:38 +0900 Subject: [PATCH 5/9] 3. Product of Array Except Self 2 --- product-of-array-except-self/whewchews.ts | 74 ++++++++++++----------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/product-of-array-except-self/whewchews.ts b/product-of-array-except-self/whewchews.ts index e30a890a4..0c7a1384e 100644 --- a/product-of-array-except-self/whewchews.ts +++ b/product-of-array-except-self/whewchews.ts @@ -8,34 +8,36 @@ function productExceptSelf(nums: number[]): number[] { * 2. 자신이 0이 아니면 * 2-1. zeroCount가 있는지 보고 있으면 0을 return * 2-2. zero가 없으면 sum/self를 return + * + * 그러나... 문제에 나누기 연산자를 쓰면 안된다고 했으므로 Solution 2로 가자. */ - let zeroCount = 0; - const sum = nums.reduce((p, c) => { - if (c === 0) { - zeroCount += 1; - return p; - } - p = p * c; - return p; - }, 1); + // let zeroCount = 0; + // const sum = nums.reduce((p, c) => { + // if (c === 0) { + // zeroCount += 1; + // return p; + // } + // p = p * c; + // return p; + // }, 1); - const hasZero = zeroCount > 0; + // const hasZero = zeroCount > 0; - if (zeroCount === nums.length) return Array(nums.length).fill(0); + // if (zeroCount === nums.length) return Array(nums.length).fill(0); - return nums.map((n) => { - if (n === 0) { - // 자신 이외에 0이 있을때 - if (zeroCount - 1 > 0) { - return 0; - } + // return nums.map((n) => { + // if (n === 0) { + // // 자신 이외에 0이 있을때 + // if (zeroCount - 1 > 0) { + // return 0; + // } - return sum; - } + // return sum; + // } - if (hasZero) return 0; - return sum / n; - }); + // if (hasZero) return 0; + // return sum / n; + // }); // TC: O(N) // SC: O(N) @@ -44,25 +46,25 @@ function productExceptSelf(nums: number[]): number[] { * 2. suffix: 자신을 제외한 자기 뒤까지의 곱을 저장한다. * 3. answer[i] = prefix[i] * suffix[i] */ - // const n = nums.length; + const n = nums.length; - // const prefix = new Array(n).fill(1); - // const suffix = new Array(n).fill(1); + const prefix = new Array(n).fill(1); + const suffix = new Array(n).fill(1); - // for (let i = 1; i < n; i++) { - // prefix[i] = prefix[i - 1] * nums[i - 1]; - // } + for (let i = 1; i < n; i++) { + prefix[i] = prefix[i - 1] * nums[i - 1]; + } - // for (let i = n - 2; i >= 0; i--) { - // suffix[i] = suffix[i + 1] * nums[i + 1]; - // } + for (let i = n - 2; i >= 0; i--) { + suffix[i] = suffix[i + 1] * nums[i + 1]; + } - // const answer = []; - // for (let i = 0; i < n; i++) { - // answer[i] = prefix[i] * suffix[i]; - // } + const answer = []; + for (let i = 0; i < n; i++) { + answer[i] = prefix[i] * suffix[i]; + } - // return answer; + return answer; } // TC: O(N) // SC: O(N) From 3c26ea7a0c911faff43c21866a88f4bb9aaed403 Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 03:20:54 +0900 Subject: [PATCH 6/9] 5. coin change --- coin-change/whewchews.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 coin-change/whewchews.ts diff --git a/coin-change/whewchews.ts b/coin-change/whewchews.ts new file mode 100644 index 000000000..a5fb423d1 --- /dev/null +++ b/coin-change/whewchews.ts @@ -0,0 +1,33 @@ +function coinChange(coins: number[], amount: number): number { + /* # Solution 1: BFS + * 최소 경로를 찾는 문제 => BFS + * 현재까지 사용한 동전의 개수와 현재까지 사용한 동전의 합을 queue에 넣는다. + * visited: 중복 방문을 방지하기 위한 set + * 누적액이 amount와 같아지면 count를 return + * visited에 누적액이 있으면 continue + * coins를 순회하면서 누적액에 동전을 더한 값이 amount보다 작으면 queue에 넣는다. + * queue가 빌때까지 반복 + * 큐가 비어있고 amount를 만들수 없으면 -1을 return + */ + const queue = [[0, 0]]; // [number of coins, accumulated amount] + const visited = new Set(); + + while (queue.length > 0) { + const [count, total] = queue.shift(); + if (total === amount) { + return count; + } + if (visited.has(total)) { + continue; + } + visited.add(total); + for (const coin of coins) { + if (total + coin <= amount) { + queue.push([count + 1, total + coin]); + } + } + } + return -1; + // TC: 각 금액(amount)마다 동전(coins)을 순회하므로 O(N*M) N: amount, M: coins.length + // SC: O(N) N: amount +} From c0d6bb0bb51aea612dcf89fe285b85a8ddbe0eba Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 03:27:57 +0900 Subject: [PATCH 7/9] chore: lint --- coin-change/whewchews.ts | 7 +++---- combination-sum/whewchews.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/coin-change/whewchews.ts b/coin-change/whewchews.ts index a5fb423d1..58ce1942c 100644 --- a/coin-change/whewchews.ts +++ b/coin-change/whewchews.ts @@ -8,8 +8,7 @@ function coinChange(coins: number[], amount: number): number { * coins를 순회하면서 누적액에 동전을 더한 값이 amount보다 작으면 queue에 넣는다. * queue가 빌때까지 반복 * 큐가 비어있고 amount를 만들수 없으면 -1을 return - */ - const queue = [[0, 0]]; // [number of coins, accumulated amount] + */ const queue = [[0, 0]]; // [number of coins, accumulated amount] const visited = new Set(); while (queue.length > 0) { @@ -28,6 +27,6 @@ function coinChange(coins: number[], amount: number): number { } } return -1; - // TC: 각 금액(amount)마다 동전(coins)을 순회하므로 O(N*M) N: amount, M: coins.length - // SC: O(N) N: amount } +// TC: 각 금액(amount)마다 동전(coins)을 순회하므로 O(N*M) N: amount, M: coins.length +// SC: O(N) N: amount diff --git a/combination-sum/whewchews.ts b/combination-sum/whewchews.ts index f0d5fc7e1..4f32d6510 100644 --- a/combination-sum/whewchews.ts +++ b/combination-sum/whewchews.ts @@ -120,4 +120,4 @@ function combinationSum(candidates: number[], target: number): number[][] { } // TC: O(C * T * K) -// SC: O((T+1) * K* T) \ No newline at end of file +// SC: O((T+1) * K* T) From b7e3dd7c708f52898bab1be6b10abd8adfd0aeef Mon Sep 17 00:00:00 2001 From: whewchews Date: Sat, 31 Aug 2024 03:38:37 +0900 Subject: [PATCH 8/9] fix: climb stairs logic --- climbing-stairs/whewchews.ts | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/climbing-stairs/whewchews.ts b/climbing-stairs/whewchews.ts index 2ce050bb0..1f9f097ba 100644 --- a/climbing-stairs/whewchews.ts +++ b/climbing-stairs/whewchews.ts @@ -7,26 +7,26 @@ function climbStairs(n: number): number { * 1 -> [1] * 2 -> [1,1] [2] * 3 -> [1,1,1] [2,1] [1,2] - * 4 -> [1,1,1,1] [2,1,1] [1,2,1] [1,1,2] [2,2] + * 4 -> [1,1,1,1] [2,1,1] [1,2,1] [1,1,2] [2,2] * 5 -> [1,1,1,1,1] [2,1,1,1] [1,2,1,1] [1,1,2,1] [1,1,1,2] [2,2,1], [1,2,2], [2,1,2] - * 6 -> [1,1,1,1,1,1] [2,1,1,1,1] [...] [1,1,1,1,2] [2,2,1,1], [2,1,2,1], [2,1,1,2] [1,1,2,2], [1,2,1,2], [1,2,2,1] - => (1-n, 2-0) n가지 (1:n-2, 2:1) (n-1)*(n-2)/(n-2) 가지 (1: n-4, 2: n/2) (n-2)*(n-3)/2 가지 + * 6 -> [1,1,1,1,1,1] [2,1,1,1,1] [...] [1,1,1,1,2] [2,2,1,1], [2,1,2,1], [2,1,1,2] [1,1,2,2], [1,2,1,2], [1,2,2,1] + => (1:n, 2:0) n가지 (1:n-2, 2:1) / n가지 (1: n-4, 2: n/2) C(n, n/2) 가지 */ - // # solution 1 - // TC: O(N) - // SC: O(N) + // # Solution 1 + // const stair = {1: 1, 2:2} // for(let i = 3; i<=n; i++){ // stair[i] = stair[i-1] + stair[i-2] // } - - // # solution 2 // TC: O(N) - // SC: O(1) + // SC: O(N) + + // # Solution 2 + // if(n < 3) return n - // let curr = 2 - // let prev = 1 + // let curr = 2 // 현재 계단을 오르는 방법 수 + // let prev = 1 // 이전 계단을 오르는 방법 수 // for(let i=0; i Date: Sun, 1 Sep 2024 02:53:40 +0900 Subject: [PATCH 9/9] fix: TC, SC --- climbing-stairs/whewchews.ts | 18 ++++++++--------- coin-change/whewchews.ts | 5 +++-- combination-sum/whewchews.ts | 17 ++++++---------- product-of-array-except-self/whewchews.ts | 24 +++++++++++------------ two-sum/whewchews.ts | 19 +++++++++--------- 5 files changed, 39 insertions(+), 44 deletions(-) diff --git a/climbing-stairs/whewchews.ts b/climbing-stairs/whewchews.ts index 1f9f097ba..da3386cf0 100644 --- a/climbing-stairs/whewchews.ts +++ b/climbing-stairs/whewchews.ts @@ -1,5 +1,4 @@ -function climbStairs(n: number): number { - /* +/* * 아이디어 * 층수 제한: 1 <= n <= 45 * 1 or 2 step 만 올라갈 수 있음 @@ -12,7 +11,7 @@ function climbStairs(n: number): number { * 6 -> [1,1,1,1,1,1] [2,1,1,1,1] [...] [1,1,1,1,2] [2,2,1,1], [2,1,2,1], [2,1,1,2] [1,1,2,2], [1,2,1,2], [1,2,2,1] => (1:n, 2:0) n가지 (1:n-2, 2:1) / n가지 (1: n-4, 2: n/2) C(n, n/2) 가지 */ - +function climbStairs(n: number): number { // # Solution 1 // const stair = {1: 1, 2:2} @@ -41,13 +40,14 @@ function climbStairs(n: number): number { // # Solution 3: 재귀 const memo = { 1: 1, 2: 2 }; function calculateClimbingWay(n, memo) { - if (!(n in memo)) { - if (n < 3) { - return n; - } - memo[n] = - calculateClimbingWay(n - 1, memo) + calculateClimbingWay(n - 2, memo); + if (n in memo) return memo[n]; + + if (n < 3) { + return n; } + memo[n] = + calculateClimbingWay(n - 1, memo) + calculateClimbingWay(n - 2, memo); + return memo[n]; } return calculateClimbingWay(n, memo); diff --git a/coin-change/whewchews.ts b/coin-change/whewchews.ts index 58ce1942c..c9757d4fc 100644 --- a/coin-change/whewchews.ts +++ b/coin-change/whewchews.ts @@ -8,7 +8,8 @@ function coinChange(coins: number[], amount: number): number { * coins를 순회하면서 누적액에 동전을 더한 값이 amount보다 작으면 queue에 넣는다. * queue가 빌때까지 반복 * 큐가 비어있고 amount를 만들수 없으면 -1을 return - */ const queue = [[0, 0]]; // [number of coins, accumulated amount] + */ + const queue = [[0, 0]]; // [number of coins, accumulated amount] const visited = new Set(); while (queue.length > 0) { @@ -28,5 +29,5 @@ function coinChange(coins: number[], amount: number): number { } return -1; } -// TC: 각 금액(amount)마다 동전(coins)을 순회하므로 O(N*M) N: amount, M: coins.length +// TC: 각 금액(amount)마다 동전(coins)을 순회하므로 O(N^2*M) N: amount, M: coins.length // SC: O(N) N: amount diff --git a/combination-sum/whewchews.ts b/combination-sum/whewchews.ts index 4f32d6510..b891bc0bb 100644 --- a/combination-sum/whewchews.ts +++ b/combination-sum/whewchews.ts @@ -36,8 +36,7 @@ function combinationSum(candidates: number[], target: number): number[][] { * */ - // TC: O(2^N) N = candidates.length - // SC: O(T) T = target + function backtrack(candidates: number[], start:number, total:number){ if(target === total){ result.push([...path]) @@ -64,8 +63,8 @@ function combinationSum(candidates: number[], target: number): number[][] { return result }; - // TC: O(2^N) - // SC: O(2^N) + // TC: O(n^t) n = candidates.length, t = target 크기 + // SC: O(t) /* #Solution 2 : DP * candidates을 가지고 target 값을 만들 수 있는 모든 조합을 미리 찾아둔다. @@ -99,17 +98,13 @@ function combinationSum(candidates: number[], target: number): number[][] { - // SC: O(T+1) T = target + // SC: O(t) t = target const dp = Array.from({ length: target + 1 }, () => []); dp[0] = [[]]; -// TC: O(C), C = candidates.length for (let candidate of candidates) { - // TC: O(T) T = target for (let i = candidate; i <= target; i++) { - // TC: O(K) K = dp[i - candidate].length - // SC: O(K) for (let combination of dp[i - candidate]) { dp[i].push([...combination, candidate]); } @@ -119,5 +114,5 @@ function combinationSum(candidates: number[], target: number): number[][] { return dp[target]; } -// TC: O(C * T * K) -// SC: O((T+1) * K* T) +// TC: O(n * t * 2^n) n = candidates.length, t = target +// SC: O((t*2^n) // 최악의 경우 모든 조합(2^n) 저장 가능 diff --git a/product-of-array-except-self/whewchews.ts b/product-of-array-except-self/whewchews.ts index 0c7a1384e..c7cb4fec9 100644 --- a/product-of-array-except-self/whewchews.ts +++ b/product-of-array-except-self/whewchews.ts @@ -1,16 +1,16 @@ +/* #Solution 1 + * sum: 전체 곱을 구한다. + * zeroCount: 0의 개수가 몇개인지 센다. + * 1. 자신이 0이면, + * 1-1. 자신이외의 0이 있는지 확인하고 있으면 0을 return + * 1-2. 자신 이외에 0이 없으면 전체 곱을 return + * 2. 자신이 0이 아니면 + * 2-1. zeroCount가 있는지 보고 있으면 0을 return + * 2-2. zero가 없으면 sum/self를 return + * + * 그러나... 문제에 나누기 연산자를 쓰면 안된다고 했으므로 Solution 2로 가자. + */ function productExceptSelf(nums: number[]): number[] { - /* #Solution 1 - * sum: 전체 곱을 구한다. - * zeroCount: 0의 개수가 몇개인지 센다. - * 1. 자신이 0이면, - * 1-1. 자신이외의 0이 있는지 확인하고 있으면 0을 return - * 1-2. 자신 이외에 0이 없으면 전체 곱을 return - * 2. 자신이 0이 아니면 - * 2-1. zeroCount가 있는지 보고 있으면 0을 return - * 2-2. zero가 없으면 sum/self를 return - * - * 그러나... 문제에 나누기 연산자를 쓰면 안된다고 했으므로 Solution 2로 가자. - */ // let zeroCount = 0; // const sum = nums.reduce((p, c) => { // if (c === 0) { diff --git a/two-sum/whewchews.ts b/two-sum/whewchews.ts index 1ce313543..8952ef969 100644 --- a/two-sum/whewchews.ts +++ b/two-sum/whewchews.ts @@ -1,14 +1,13 @@ +/* + * 아이디어 + * 처음부터 배열을 순회하며 [0,1] [0,2] [0,3] [0, ...], [1,2], [1,3], [1,...] ... [nums.length-2, nums.length-1] 를 돌면서 두 인자의 합이 target이 되는 지점을 찾는다. + * 순서대로 돌면 최악의 경우 가장 마지막 자리까지 갈 수도 있다. + * 절대 값이 되지 못하는, 최소 조건을 생각해보자. + * 주의1:범위가 -10^9 <= nums[i] <= 10^9로 음수값도 있음 + * 주의2: 정렬된 순서가 아님. + * 값을 Map에 저장해두고 {value: index}, Map에 자신과 더했을때 target이 나오는 value가 있는지 확인 + */ function twoSum(nums: number[], target: number): number[] { - /* - * 아이디어 - * 처음부터 배열을 순회하며 [0,1] [0,2] [0,3] [0, ...], [1,2], [1,3], [1,...] ... [nums.length-2, nums.length-1] 를 돌면서 두 인자의 합이 target이 되는 지점을 찾는다. - * 순서대로 돌면 최악의 경우 가장 마지막 자리까지 갈 수도 있다. - * 절대 값이 되지 못하는, 최소 조건을 생각해보자. - * 주의1:범위가 -10^9 <= nums[i] <= 10^9로 음수값도 있음 - * 주의2: 정렬된 순서가 아님. - * 값을 Map에 저장해두고 {value: index}, Map에 자신과 더했을때 target이 나오는 value가 있는지 확인 - */ - // SC: O(N) const dict = new Map();