diff --git a/contains-duplicate/mike2ox.ts b/contains-duplicate/mike2ox.ts new file mode 100644 index 000000000..59fb3bda7 --- /dev/null +++ b/contains-duplicate/mike2ox.ts @@ -0,0 +1,16 @@ +/** + * Source: https://leetcode.com/problems/contains-duplicate/ + * 풀이방법: Set을 이용하여 중복된 값이 있는지 확인 + * 시간복잡도: O(n) + * 공간복잡도: O(n) + * + * 생각나는 풀이방법 + * 1. 단순하게 sorted를 이용하여 이전값과 비교하여 중복된 값이 있는지 확인 + * 2. 정렬하지 않고 nums의 길이만큼의 배열을 만들어서 중복된 값이 있는지 저장하면서 확인 + */ +function containsDuplicate(nums: number[]): boolean { + // 중복된 값이 없는 자료구조 Set 활용 + const set = new Set(nums); + // Set의 size와 nums의 length를 비교하여 중복된 값이 있는지 확인 + return set.size !== nums.length; +} diff --git a/house-robber/mike2ox.ts b/house-robber/mike2ox.ts new file mode 100644 index 000000000..d75abae4d --- /dev/null +++ b/house-robber/mike2ox.ts @@ -0,0 +1,25 @@ +/** + * Source: https://leetcode.com/problems/house-robber/ + * 풀이방법: DP를 이용하여 집을 털 때 최대값을 구함 + * 시간복잡도: O(n) + * 공간복잡도: O(n) + * + * 생각나는 풀이방법 + */ +function rob(nums: number[]): number { + if (nums.length === 0) return 0; + if (nums.length === 1) return nums[0]; + if (nums.length === 2) return Math.max(nums[0], nums[1]); + + let prev = nums[0]; + let maxResult = Math.max(nums[0], nums[1]); + let current = 0; + + // 남은 집을 순회하면서 최대값을 구함 + for (let i = 2; i < nums.length; i++) { + current = Math.max(maxResult, prev + nums[i]); + prev = maxResult; + maxResult = current; + } + return maxResult; +} diff --git a/longest-consecutive-sequence/mike2ox.ts b/longest-consecutive-sequence/mike2ox.ts new file mode 100644 index 000000000..697529d01 --- /dev/null +++ b/longest-consecutive-sequence/mike2ox.ts @@ -0,0 +1,32 @@ +/** + * Source: https://leetcode.com/problems/longest-consecutive-sequence/ + * 풀이방법: 정렬 후 순회를 통해 연속된 값이 있는지 확인 + * 시간복잡도: O(nlogn) + * 공간복잡도: O(1) + * + * 생각나는 풀이방법 + */ + +function longestConsecutive(nums: number[]): number { + if (nums.length === 0) return 0; + const sorted = nums.sort((a, b) => a - b); + let prev = sorted[0]; + let result = 1; + let candiResult = 1; + + for (let current of sorted) { + if (prev === current) continue; + if (current === prev + 1) { + candiResult += 1; + } else { + if (candiResult > result) { + result = candiResult; + } + candiResult = 1; + } + prev = current; + } + + if (candiResult > result) result = candiResult; + return result; +} diff --git a/top-k-frequent-elements/mike2ox.ts b/top-k-frequent-elements/mike2ox.ts new file mode 100644 index 000000000..16b587600 --- /dev/null +++ b/top-k-frequent-elements/mike2ox.ts @@ -0,0 +1,22 @@ +/** + * Source: https://leetcode.com/problems/top-k-frequent-elements/ + * 풀이방법: 순회를 통해 빈도수를 저장, Object.entries를 통해 정렬하여 k개까지 반환 + * 시간복잡도: O(nlogn) + * 공간복잡도: O(n) + * + * 생각나는 풀이방법 + */ +function topKFrequent(nums: number[], k: number): number[] { + const KFrequentObject = new Object(); + const result = new Array(); + for (let num of nums) { + if (!Object.hasOwn(KFrequentObject, num)) KFrequentObject[num] = 0; + KFrequentObject[num]++; + } + // Object.entries를 통해 key, value를 배열로 반환 (포인트) + let sorted = Object.entries(KFrequentObject).sort((a, b) => b[1] - a[1]); + for (let node of sorted) { + result.push(parseInt(node[0])); + } + return result.slice(0, k); +} diff --git a/valid-palindrome/mike2ox.ts b/valid-palindrome/mike2ox.ts new file mode 100644 index 000000000..5ad7c9d5f --- /dev/null +++ b/valid-palindrome/mike2ox.ts @@ -0,0 +1,29 @@ +/** + * Source: https://leetcode.com/problems/valid-palindrome/ + * 풀이방법: 문자열을 조건에 맞게 정제한 후 reverse하여 비교 + * 시간복잡도: O(n) + * 공간복잡도: O(n) + * + * 생각나는 풀이방법 + * 1. 정규식을 이용하여 문자열을 정제한 후 reverse하여 비교 => 정규식 작성을 못해서 배제 + * 2. 문자열을 순회하면서 조건에 맞는 문자만 배열에 저장한 후 reverse하여 비교 + */ +function isPalindrome(s: string): boolean { + // 미리 길이가 2보다 작은 경우는 true로 반환(Palindrome 조건에 맞음) + if (s.length < 2) return true; + const formatted: string[] = []; + + // 문자열을 순회하면서 조건에 맞는 문자만 소문자로 변환해서 배열에 저장 + for (let c of s) { + if ( + (c >= "a" && c <= "z") || + (c >= "A" && c <= "Z") || + (c >= "0" && c <= "9") + ) + formatted.push(c.toLowerCase()); + } + // formatted 배열을 reverse하여 JSON.stringify로 비교 (중요) + // ? toReverse()가 chrome console에서는 작동하는데 여기서는 왜 안되는지 모르겠음 + const reversed = [...formatted].reverse(); + return JSON.stringify(reversed) === JSON.stringify(formatted); +}