diff --git a/contains-duplicate/smosco.js b/contains-duplicate/smosco.js new file mode 100644 index 000000000..44f1faa4e --- /dev/null +++ b/contains-duplicate/smosco.js @@ -0,0 +1,8 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ +const containsDuplicate = (nums) => { + let uniqueNumSet = new Set(nums); + return uniqueNumSet.size !== nums.length; +}; diff --git a/house-robber/smosco.js b/house-robber/smosco.js new file mode 100644 index 000000000..ce1eac52c --- /dev/null +++ b/house-robber/smosco.js @@ -0,0 +1,26 @@ +/** + * House Robber 문제 + * + * 시간 복잡도: O(n) + * 공간 복잡도: O(1) + * + * 접근 방법: + * - Dynamic Programming을 사용하여 각 위치에서의 최대 금액을 계산 + * - 현재 집을 털 경우: 전전 집까지의 최대값 + 현재 집의 금액 + * - 현재 집을 안 털 경우: 이전 집까지의 최대값 + * - 두 경우 중 최대값을 선택 + */ +const rob = (nums) => { + if (nums.length === 1) return nums[0]; + + let prev2 = nums[0]; // 전전 집까지의 최대 금액 + let prev1 = Math.max(nums[0], nums[1]); // 이전 집까지의 최대 금액 + + for (let i = 2; i < nums.length; i++) { + const current = Math.max(prev1, prev2 + nums[i]); + prev2 = prev1; + prev1 = current; + } + + return prev1; +}; diff --git a/longest-consecutive-sequence/smosco.js b/longest-consecutive-sequence/smosco.js new file mode 100644 index 000000000..a033f4261 --- /dev/null +++ b/longest-consecutive-sequence/smosco.js @@ -0,0 +1,28 @@ +/** + * @param {number[]} nums + * @return {number} + */ +const longestConsecutive = (nums) => { + if (nums.length === 0) return 0; + + const numSet = new Set(nums); + let maxLength = 0; + + for (const num of numSet) { + // 시퀀스 시작점만 체크 + if (!numSet.has(num - 1)) { + let currentNum = num; + let currentLength = 1; + + // 연속된 숫자 카운트 + while (numSet.has(currentNum + 1)) { + currentNum++; + currentLength++; + } + + maxLength = Math.max(maxLength, currentLength); + } + } + + return maxLength; +};