diff --git a/climbing-stairs/1lsang.ts b/climbing-stairs/1lsang.ts new file mode 100644 index 000000000..c0fd16eb6 --- /dev/null +++ b/climbing-stairs/1lsang.ts @@ -0,0 +1,19 @@ +// n번째 칸 까지 오르기 위해서는 n-1번째 칸에서 1칸을 오르거나 n-2번째 칸에서 2칸을 오르면 됨. + +/* +최초에 생각한 방법은 재귀 구현 But 재귀 구현시에는 O(2^n)으로 시간복잡도가 너무 커서 Time Limit에 걸림. + +function climbStairs(n: number): number { + if (n === 1) return 1; // 1칸을 오르는 방법은 1개 + if (n === 2) return 2; // 2칸을 오르는 방법은 1+1/2 2개 + return climbStairs(n-1) + climbStairs(n-2); +}; +*/ + +function climbStairs(n: number): number { + const arr: number[] = [1, 2]; + for (let i = 2; i < n; i++) { + arr.push(arr[i-1] + arr[i-2]); + } + return arr[n-1]; +}; diff --git a/product-of-array-except-self/1lsang.ts b/product-of-array-except-self/1lsang.ts new file mode 100644 index 000000000..09d297a8e --- /dev/null +++ b/product-of-array-except-self/1lsang.ts @@ -0,0 +1,22 @@ +// 배열에서 인덱스의 숫자만 제외한 원소의 곱의 배열을 return 하는 문제 + +// 1. 전체의 곱을 구한 뒤, 해당 인덱스의 수를 나눈 배열을 만들면, +// n을 2번만 반복하면 되므로 2n 즉, O(n)으로 해결 가능 + +// 2. 하지만 수에 0이 섞여있다면? +// 0을 곱한 경우는 전부 0이므로 해당 케이스 고려 필요 +// 0이 1개인 경우 0이 아닌 모든 수의 곱이 0인 인덱스에 들어가고, 나머지는 0 +// 0이 2개 이상인 경우 전부 0 + +function productExceptSelf(nums: number[]): number[] { + const zeroIndices:number[] = []; + nums.forEach((num, index) => { + if (num === 0) { + zeroIndices.push(index); + } + }) + if (zeroIndices.length > 1) return Array.from({length: nums.length}).map(() => 0); + const productOfAll = nums.reduce((prev, cur) => (cur === 0 ? prev : prev * cur), 1); + if (zeroIndices.length === 1) return Array.from({length: nums.length}).map((_, index) => index === zeroIndices[0] ? productOfAll : 0); + return nums.map((num) => productOfAll/num); +}; diff --git a/valid-anagram/1lsang.ts b/valid-anagram/1lsang.ts new file mode 100644 index 000000000..1b5c927a0 --- /dev/null +++ b/valid-anagram/1lsang.ts @@ -0,0 +1,13 @@ +const getCountObj = (s: string) => { + const obj:Record = {}; + s.split('').forEach((v) => obj[v] ? obj[v]+=1 : obj[v] = 1); + return obj; +} + +const isEqual = (a: Record, b: Record) => { + return Object.entries(a).every(([key, value]) => b[key] === value) +} + +function isAnagram(s: string, t: string): boolean { + return s.length === t.length && isEqual(getCountObj(s), getCountObj(t)); +};