From 407b10eef841c8b1690375388f6b55fbed678b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Sun, 8 Dec 2024 21:10:25 +0900 Subject: [PATCH 01/13] add: solve #217 Contains Duplicate with ts --- contains-duplicate/YJason-K.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 contains-duplicate/YJason-K.ts diff --git a/contains-duplicate/YJason-K.ts b/contains-duplicate/YJason-K.ts new file mode 100644 index 000000000..4b14b86db --- /dev/null +++ b/contains-duplicate/YJason-K.ts @@ -0,0 +1,17 @@ +/** + * Set 자료구조를 사용하여 중복 확인 (시간 복잡도: O(n) ) + * @param nums 중복 검사할 숫자 배열 + * @returns boolean 중복 여부 + */ + +function containsDuplicate(nums: number[]): boolean { + let unique: Set = new Set([]); + for (const num of nums) { + if (unique.has(num)) { + return true + } else { + unique.add(num) + } + } + return false; +}; \ No newline at end of file From 60d362f41800793bf439131708bcb7d8f6426033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Mon, 9 Dec 2024 13:26:01 +0900 Subject: [PATCH 02/13] add: solve #220 Valid Palindrome with ts --- valid-palindrome/YJason-K.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 valid-palindrome/YJason-K.ts diff --git a/valid-palindrome/YJason-K.ts b/valid-palindrome/YJason-K.ts new file mode 100644 index 000000000..b03871a5d --- /dev/null +++ b/valid-palindrome/YJason-K.ts @@ -0,0 +1,32 @@ +/** + * 문자열을 알파벳 대문자를 소문자로 변환 및 숫자만 남기는 변환 유틸 + * - 시간 복잡도: O(n) (입력된 문자열의 길이에 비례) + * + * @param {string} s - 정제할 물자열 + * @returns {string} - 소문자 알파벳과 숫자로 이루어진 문자열 + */ +const refinePhrase = (s:string) : string => s.toLowerCase().replace(/[^a-z0-9]/g, ''); + + +/** + * 문자열을 정제후 palindrome 여부 확인 하는 함수 + * - 시간 복잡도: O(n) (문자열 정제 + 투 포인터 알고리즘) + * + * @param {string} s palindrome 여부를 확인할 문자열 + * @returns {boolean} palindrome 여부 + */ +function isPalindrome(s: string): boolean { + const refined = refinePhrase(s); + + // two pointer를 활용한 palindrome 확인 O(n) + let left = 0, right = refined.length - 1; + while (left < right) { + if (refined[left] !== refined[right]) { + return false; + } + left++; + right--; + } + + return true; +} From dc36e33efbbd8145477f7b87381823ba38c610b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Mon, 9 Dec 2024 21:37:32 +0900 Subject: [PATCH 03/13] add: solve #237 Top K Frequent Elements with ts --- top-k-frequent-elements/YJason-K.ts | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 top-k-frequent-elements/YJason-K.ts diff --git a/top-k-frequent-elements/YJason-K.ts b/top-k-frequent-elements/YJason-K.ts new file mode 100644 index 000000000..b406499e2 --- /dev/null +++ b/top-k-frequent-elements/YJason-K.ts @@ -0,0 +1,34 @@ +/** + * 배열에서 각 숫자의 빈도를 계산한 후 상위 k개의 빈도 요소를 반환하는 함수 + * - 시간 복잡도: O(n + m log m) + * - O(n): 숫자 빈도를 계산하는 루프 + * - O(m log m): 고유 숫자(m)에 대한 정렬 + * - 공간 복잡도: O(m) + * - 고유 숫자(m)에 비례한 Map과 정렬된 배열 사용 + * + * @param {number[]} nums - 숫자 배열 + * @param {number} k - 반환할 상위 빈도 요소의 개수 + * @returns {number[]} 상위 k개의 빈도 요소 (순서는 상관 없음) + */ +function topKFrequent(nums: number[], k: number): number[] { + let numMap = new Map(); // 숫자의 빈도를 저장할 Map + + // 1. 숫자 빈도 Map 생성 O(n) + for (const num of nums) { + // Map에 현재 숫자가 없으면 1로 초기화, 있으면 1 증가 + const value = numMap.get(num) ? numMap.get(num) + 1 : 1; + numMap.set(num, value); + } + + // 2. Map을 [숫자, 빈도수] 배열로 변환한 뒤 빈도수 기준 내림차순 정렬 O(m log m) + const sortedFrequent = [...numMap.entries()] // Map을 배열로 변환 + .sort((a, b) => b[1] - a[1]) // 빈도수 기준 내림차순 정렬 + + // 3. 상위 k개의 숫자만 추출 O(k) + .slice(0, k) + + // 4. 숫자(key)만 추출 O(k) + .map(entry => entry[0]); + + return sortedFrequent; +} From 4c42e811c4a4df00075bc173b5a5e46b9e2c4972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Tue, 10 Dec 2024 23:47:08 +0900 Subject: [PATCH 04/13] add: solve #240 Longest Consecutive Sequence with ts --- longest-consecutive-sequence/YJason-K.ts | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 longest-consecutive-sequence/YJason-K.ts diff --git a/longest-consecutive-sequence/YJason-K.ts b/longest-consecutive-sequence/YJason-K.ts new file mode 100644 index 000000000..ceba08cd3 --- /dev/null +++ b/longest-consecutive-sequence/YJason-K.ts @@ -0,0 +1,40 @@ +/** + * 주어진 배열에서 가장 긴 연속된 숫자 시퀀스의 길이를 반환하는 함수 + * - 시간 복잡도: O(n) + * - O(n): Set에 숫자를 추가하고, 각 숫자를 순회하면서 연속된 시퀀스를 계산 + * - 공간 복잡도: O(n) + * - O(n): 숫자를 저장하기 위한 Set 사용 + * + * @param {number[]} nums - 정수 배열 + * @returns {number} - 가장 긴 연속된 숫자 시퀀스의 길이 + */ +function longestConsecutive(nums: number[]): number { + if (nums.length === 0) return 0; // 빈 배열 처리 (길이 0 반환) + + // 1. 배열을 Set에 저장하여 중복을 제거하고 빠른 조회를 가능하게 함 O(n) + const numSet = new Set(nums); + + let longestSeq = 0; // 가장 긴 연속 시퀀스 길이를 저장할 변수 + + // 2. 각 숫자가 시퀀스의 시작점인지 확인 + for (const num of numSet) { + // 숫자 `num`이 시퀀스의 시작점인지 확인 + // (num-1이 Set에 없다면 num은 시퀀스의 시작점) + if (!numSet.has(num - 1)) { + // 새로운 시퀀스 시작 + let curNum = num; + let curSeq = 1; + + // 3. 시퀀스가 끝날 때까지 길이를 계산 O(n) + while (numSet.has(curNum + 1)) { + curNum += 1; // 현재 숫자를 1 증가 + curSeq += 1; // 시퀀스 길이를 1 증가 + } + + // 4. 가장 긴 시퀀스 길이를 업데이트 + longestSeq = Math.max(longestSeq, curSeq); + } + } + + return longestSeq; // 가장 긴 연속 시퀀스의 길이 반환 +} From d68a21ddeba10bb2e75e65fbd61a2de63a5cc9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Thu, 12 Dec 2024 21:04:33 +0900 Subject: [PATCH 05/13] add: solve #198 House Robber with ts --- house-robber/YJason-K.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 house-robber/YJason-K.ts diff --git a/house-robber/YJason-K.ts b/house-robber/YJason-K.ts new file mode 100644 index 000000000..98fe0bbb5 --- /dev/null +++ b/house-robber/YJason-K.ts @@ -0,0 +1,30 @@ +/** + * 주어진 배열에서 인접한 집을 털지 않고 훔칠 수 있는 최대 금액을 계산하는 함수 + * - 시간 복잡도: O(n) + * - 배열을 한 번 순회하면서 최대 금액을 계산 + * - 공간 복잡도: O(1) + * - 추가 배열 없이 변수만 사용하여 공간 효율성을 최적화 + * + * @param {number[]} nums - 각 집에 있는 돈의 양을 나타내는 배열 + * @returns {number} - 경보를 울리지 않고 훔칠 수 있는 최대 금액 + */ +function rob(nums: number[]): number { + if (nums.length === 0) return 0; // 빈 배열 처리 + if (nums.length === 1) return nums[0]; // 집이 한 채만 있는 경우, 그 집의 돈 반환 + + // 1. 변수 초기화: 이전 두 집까지의 최대 금액 + let prev2 = 0; // 두 번째 이전 집까지의 최대 금액 + let prev1 = nums[0]; // 첫 번째 이전 집까지의 최대 금액 + + // 2. 배열 순회: 각 집에서 훔칠 수 있는 최대 금액 계산 + for (let i = 1; i < nums.length; i++) { + // 현재 집까지의 최대 금액은 (현재 집 + prev2) 또는 prev1 중 더 큰 값 + const cur = Math.max(nums[i] + prev2, prev1); + + // 이전 두 집의 최대 금액 업데이트 + prev2 = prev1; + prev1 = cur; + } + + return prev1; // 마지막 집까지의 최대 금액 반환 +} \ No newline at end of file From 5732b2b331ba3b965d1a8077d0ea1370a4d510ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Thu, 12 Dec 2024 21:04:33 +0900 Subject: [PATCH 06/13] add: solve #264 House Robber with ts --- house-robber/YJason-K.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 house-robber/YJason-K.ts diff --git a/house-robber/YJason-K.ts b/house-robber/YJason-K.ts new file mode 100644 index 000000000..98fe0bbb5 --- /dev/null +++ b/house-robber/YJason-K.ts @@ -0,0 +1,30 @@ +/** + * 주어진 배열에서 인접한 집을 털지 않고 훔칠 수 있는 최대 금액을 계산하는 함수 + * - 시간 복잡도: O(n) + * - 배열을 한 번 순회하면서 최대 금액을 계산 + * - 공간 복잡도: O(1) + * - 추가 배열 없이 변수만 사용하여 공간 효율성을 최적화 + * + * @param {number[]} nums - 각 집에 있는 돈의 양을 나타내는 배열 + * @returns {number} - 경보를 울리지 않고 훔칠 수 있는 최대 금액 + */ +function rob(nums: number[]): number { + if (nums.length === 0) return 0; // 빈 배열 처리 + if (nums.length === 1) return nums[0]; // 집이 한 채만 있는 경우, 그 집의 돈 반환 + + // 1. 변수 초기화: 이전 두 집까지의 최대 금액 + let prev2 = 0; // 두 번째 이전 집까지의 최대 금액 + let prev1 = nums[0]; // 첫 번째 이전 집까지의 최대 금액 + + // 2. 배열 순회: 각 집에서 훔칠 수 있는 최대 금액 계산 + for (let i = 1; i < nums.length; i++) { + // 현재 집까지의 최대 금액은 (현재 집 + prev2) 또는 prev1 중 더 큰 값 + const cur = Math.max(nums[i] + prev2, prev1); + + // 이전 두 집의 최대 금액 업데이트 + prev2 = prev1; + prev1 = cur; + } + + return prev1; // 마지막 집까지의 최대 금액 반환 +} \ No newline at end of file From a774fefd3a2ed0105d176aa379d7506de3956d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=98=81=EC=9E=AC?= Date: Thu, 12 Dec 2024 21:15:50 +0900 Subject: [PATCH 07/13] fix: add line break --- contains-duplicate/YJason-K.ts | 2 +- house-robber/YJason-K.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contains-duplicate/YJason-K.ts b/contains-duplicate/YJason-K.ts index 4b14b86db..07cdb4f3a 100644 --- a/contains-duplicate/YJason-K.ts +++ b/contains-duplicate/YJason-K.ts @@ -14,4 +14,4 @@ function containsDuplicate(nums: number[]): boolean { } } return false; -}; \ No newline at end of file +}; diff --git a/house-robber/YJason-K.ts b/house-robber/YJason-K.ts index 98fe0bbb5..6a32fdb12 100644 --- a/house-robber/YJason-K.ts +++ b/house-robber/YJason-K.ts @@ -27,4 +27,4 @@ function rob(nums: number[]): number { } return prev1; // 마지막 집까지의 최대 금액 반환 -} \ No newline at end of file +} From 190a83a2a7c93e006b015058d8eb601687e24925 Mon Sep 17 00:00:00 2001 From: Youngjae Kim Date: Mon, 16 Dec 2024 21:10:47 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=EA=B7=9C=EC=B9=99=20=EC=9C=84=EB=B0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contains-duplicate/YJason-K.ts | 1 + house-robber/YJason-K.ts | 1 + longest-consecutive-sequence/YJason-K.ts | 1 + top-k-frequent-elements/YJason-K.ts | 2 ++ valid-palindrome/YJason-K.ts | 1 + 5 files changed, 6 insertions(+) diff --git a/contains-duplicate/YJason-K.ts b/contains-duplicate/YJason-K.ts index 07cdb4f3a..ada16664e 100644 --- a/contains-duplicate/YJason-K.ts +++ b/contains-duplicate/YJason-K.ts @@ -15,3 +15,4 @@ function containsDuplicate(nums: number[]): boolean { } return false; }; + diff --git a/house-robber/YJason-K.ts b/house-robber/YJason-K.ts index 6a32fdb12..a62d74e95 100644 --- a/house-robber/YJason-K.ts +++ b/house-robber/YJason-K.ts @@ -28,3 +28,4 @@ function rob(nums: number[]): number { return prev1; // 마지막 집까지의 최대 금액 반환 } + diff --git a/longest-consecutive-sequence/YJason-K.ts b/longest-consecutive-sequence/YJason-K.ts index ceba08cd3..ae0f29a31 100644 --- a/longest-consecutive-sequence/YJason-K.ts +++ b/longest-consecutive-sequence/YJason-K.ts @@ -38,3 +38,4 @@ function longestConsecutive(nums: number[]): number { return longestSeq; // 가장 긴 연속 시퀀스의 길이 반환 } + diff --git a/top-k-frequent-elements/YJason-K.ts b/top-k-frequent-elements/YJason-K.ts index b406499e2..9f986bdc9 100644 --- a/top-k-frequent-elements/YJason-K.ts +++ b/top-k-frequent-elements/YJason-K.ts @@ -32,3 +32,5 @@ function topKFrequent(nums: number[], k: number): number[] { return sortedFrequent; } + + diff --git a/valid-palindrome/YJason-K.ts b/valid-palindrome/YJason-K.ts index b03871a5d..7ed4839fe 100644 --- a/valid-palindrome/YJason-K.ts +++ b/valid-palindrome/YJason-K.ts @@ -30,3 +30,4 @@ function isPalindrome(s: string): boolean { return true; } + From 84157c814c3b31159a805b162759824f0cb1612c Mon Sep 17 00:00:00 2001 From: Youngjae Kim <81736873+Yjason-K@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:12:42 +0900 Subject: [PATCH 09/13] Rename YJason-K.ts to Yjason-K.ts --- contains-duplicate/{YJason-K.ts => Yjason-K.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contains-duplicate/{YJason-K.ts => Yjason-K.ts} (100%) diff --git a/contains-duplicate/YJason-K.ts b/contains-duplicate/Yjason-K.ts similarity index 100% rename from contains-duplicate/YJason-K.ts rename to contains-duplicate/Yjason-K.ts From 3454c2d217805e6631de339074d4ce174e2b6556 Mon Sep 17 00:00:00 2001 From: Youngjae Kim <81736873+Yjason-K@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:13:17 +0900 Subject: [PATCH 10/13] Rename YJason-K.ts to Yjason-K.ts --- house-robber/{YJason-K.ts => Yjason-K.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename house-robber/{YJason-K.ts => Yjason-K.ts} (100%) diff --git a/house-robber/YJason-K.ts b/house-robber/Yjason-K.ts similarity index 100% rename from house-robber/YJason-K.ts rename to house-robber/Yjason-K.ts From e18b7695bd8fb1d3bd4b556e46e999e620b38cc2 Mon Sep 17 00:00:00 2001 From: Youngjae Kim <81736873+Yjason-K@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:13:38 +0900 Subject: [PATCH 11/13] Rename YJason-K.ts to Yjason-K.ts --- longest-consecutive-sequence/{YJason-K.ts => Yjason-K.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename longest-consecutive-sequence/{YJason-K.ts => Yjason-K.ts} (100%) diff --git a/longest-consecutive-sequence/YJason-K.ts b/longest-consecutive-sequence/Yjason-K.ts similarity index 100% rename from longest-consecutive-sequence/YJason-K.ts rename to longest-consecutive-sequence/Yjason-K.ts From 2b8a3ba06f2b2d0aab912b954c12e9cc13d6d2fc Mon Sep 17 00:00:00 2001 From: Youngjae Kim <81736873+Yjason-K@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:14:17 +0900 Subject: [PATCH 12/13] Rename YJason-K.ts to Yjason-K.ts --- top-k-frequent-elements/{YJason-K.ts => Yjason-K.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename top-k-frequent-elements/{YJason-K.ts => Yjason-K.ts} (100%) diff --git a/top-k-frequent-elements/YJason-K.ts b/top-k-frequent-elements/Yjason-K.ts similarity index 100% rename from top-k-frequent-elements/YJason-K.ts rename to top-k-frequent-elements/Yjason-K.ts From 07c39822aecda4737592eabc74969c5bd01a09e4 Mon Sep 17 00:00:00 2001 From: Youngjae Kim <81736873+Yjason-K@users.noreply.github.com> Date: Mon, 16 Dec 2024 21:14:55 +0900 Subject: [PATCH 13/13] Rename YJason-K.ts to Yjason-K.ts --- valid-palindrome/{YJason-K.ts => Yjason-K.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename valid-palindrome/{YJason-K.ts => Yjason-K.ts} (100%) diff --git a/valid-palindrome/YJason-K.ts b/valid-palindrome/Yjason-K.ts similarity index 100% rename from valid-palindrome/YJason-K.ts rename to valid-palindrome/Yjason-K.ts