diff --git a/contains-duplicate/HerrineKim.js b/contains-duplicate/HerrineKim.js new file mode 100644 index 000000000..ee5b0750a --- /dev/null +++ b/contains-duplicate/HerrineKim.js @@ -0,0 +1,17 @@ +// 시간복잡도: O(n) + +/** + * @param {number[]} nums + * @return {boolean} + */ +var containsDuplicate = function (nums) { + const seen = new Set(); + for (let num of nums) { + if (seen.has(num)) { + return true; // 중복 발견 + } + seen.add(num); + } + return false; // 모든 요소가 고유 +}; + diff --git a/house-robber/HerrineKim.js b/house-robber/HerrineKim.js new file mode 100644 index 000000000..36013c74b --- /dev/null +++ b/house-robber/HerrineKim.js @@ -0,0 +1,25 @@ +// 시간복잡도: O(n) + +/** + * @param {number[]} nums + * @return {number} + */ +var rob = function (nums) { + const n = nums.length; + if (n === 0) return 0; + if (n === 1) return nums[0]; + + // DP 배열 초기화 + let prev2 = 0; // dp[i-2] + let prev1 = 0; // dp[i-1] + + // 최대 수익 계산 + for (let num of nums) { + const current = Math.max(prev1, prev2 + num); + prev2 = prev1; + prev1 = current; + } + + return prev1; +}; + diff --git a/longest-consecutive-sequence/HerrineKim.js b/longest-consecutive-sequence/HerrineKim.js new file mode 100644 index 000000000..454bef7a7 --- /dev/null +++ b/longest-consecutive-sequence/HerrineKim.js @@ -0,0 +1,32 @@ +// 시간복잡도: O(n) + +/** + * @param {number[]} nums + * @return {number} + */ +var longestConsecutive = function (nums) { + // Set을 사용해 중복 제거 + const numSet = new Set(nums); + let longestStreak = 0; + + // 각 숫자를 기준으로 연속 시퀀스를 탐색 + for (let num of numSet) { + // num이 시퀀스의 시작점인 경우만 탐색 + if (!numSet.has(num - 1)) { + let currentNum = num; + let currentStreak = 1; + + // 현재 시퀀스를 따라가며 길이 계산 + while (numSet.has(currentNum + 1)) { + currentNum++; + currentStreak++; + } + + // 최대 길이를 업데이트 + longestStreak = Math.max(longestStreak, currentStreak); + } + } + + return longestStreak; +}; + diff --git a/top-k-frequent-elements/HerrineKim.js b/top-k-frequent-elements/HerrineKim.js new file mode 100644 index 000000000..aae514d14 --- /dev/null +++ b/top-k-frequent-elements/HerrineKim.js @@ -0,0 +1,31 @@ +// 시간복잡도: O(n) + +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ +var topKFrequent = function (nums, k) { + // 빈도 계산 + const frequencyMap = new Map(); + for (let num of nums) { + frequencyMap.set(num, (frequencyMap.get(num) || 0) + 1); + } + + // 버킷 정렬 + const bucket = Array(nums.length + 1).fill(null).map(() => []); + for (let [num, freq] of frequencyMap) { + bucket[freq].push(num); + } + + // 빈도 높은 요소들 추출 + const result = []; + for (let i = bucket.length - 1; i >= 0 && result.length < k; i--) { + if (bucket[i].length > 0) { + result.push(...bucket[i]); + } + } + + return result.slice(0, k); // 상위 k개의 요소 반환 +}; + diff --git a/valid-palindrome/HerrineKim.js b/valid-palindrome/HerrineKim.js new file mode 100644 index 000000000..49989790f --- /dev/null +++ b/valid-palindrome/HerrineKim.js @@ -0,0 +1,24 @@ +// 시간복잡도: O(n) + +/** + * @param {string} s + * @return {boolean} + */ +var isPalindrome = function (s) { + // 전처리 - 알파벳과 숫자만 남기고 소문자로 변환 + const cleanString = s.toLowerCase().replace(/[^a-z0-9]/g, ""); + + // 양 끝에서 포인터를 이동하며 확인 + let left = 0, right = cleanString.length - 1; + + while (left < right) { + if (cleanString[left] !== cleanString[right]) { + return false; // 대칭이 깨지면 false + } + left++; + right--; + } + + return true; // 대칭이 유지되면 true +}; +